home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet internetowy / Przegladarki internetowe / Mozilla Seamonkey 1.0.5 pl / seamonkey-1.0.5.pl-PL.win32.installer.exe / MAIL.XPI / bin / chrome / messenger.jar / content / messenger / mailWindowOverlay.js < prev    next >
Encoding:
Text File  |  2006-03-17  |  78.8 KB  |  2,449 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2.  * ***** BEGIN LICENSE BLOCK *****
  3.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  4.  *
  5.  * The contents of this file are subject to the Mozilla Public License Version
  6.  * 1.1 (the "License"); you may not use this file except in compliance with
  7.  * the License. You may obtain a copy of the License at
  8.  * http://www.mozilla.org/MPL/
  9.  *
  10.  * Software distributed under the License is distributed on an "AS IS" basis,
  11.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12.  * for the specific language governing rights and limitations under the
  13.  * License.
  14.  *
  15.  * The Original Code is Mozilla Communicator client code, released
  16.  * March 31, 1998.
  17.  *
  18.  * The Initial Developer of the Original Code is
  19.  * Netscape Communications Corporation.
  20.  * Portions created by the Initial Developer are Copyright (C) 1998-1999
  21.  * the Initial Developer. All Rights Reserved.
  22.  *
  23.  * Contributor(s):
  24.  *   timeless
  25.  *   slucy@objectivesw.co.uk
  26.  *   Hσkan Waara <hwaara@chello.se>
  27.  *   Jan Varga <varga@ku.sk>
  28.  *   Seth Spitzer <sspitzer@netscape.com>
  29.  *   David Bienvenu <bienvenu@netscape.com>
  30.  *   Ian Neal <bugzilla@arlen.demon.co.uk>
  31.  *
  32.  * Alternatively, the contents of this file may be used under the terms of
  33.  * either of the GNU General Public License Version 2 or later (the "GPL"),
  34.  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  35.  * in which case the provisions of the GPL or the LGPL are applicable instead
  36.  * of those above. If you wish to allow use of your version of this file only
  37.  * under the terms of either the GPL or the LGPL, and not to allow others to
  38.  * use your version of this file under the terms of the MPL, indicate your
  39.  * decision by deleting the provisions above and replace them with the notice
  40.  * and other provisions required by the GPL or the LGPL. If you do not delete
  41.  * the provisions above, a recipient may use your version of this file under
  42.  * the terms of any one of the MPL, the GPL or the LGPL.
  43.  *
  44.  * ***** END LICENSE BLOCK ***** */
  45.  
  46. const MSG_FLAG_READ              = 0x000001;
  47. const MSG_FLAG_IMAP_DELETED      = 0x200000;
  48. const MSG_FLAG_MDN_REPORT_NEEDED = 0x400000;
  49. const MSG_FLAG_MDN_REPORT_SENT   = 0x800000;
  50. const MDN_DISPOSE_TYPE_DISPLAYED = 0;
  51. const MSG_DB_LARGE_COMMIT        = 1;
  52.  
  53. const kClassicMailLayout = 0;
  54. const kWideMailLayout = 1;
  55. const kVerticalMailLayout = 2;
  56.  
  57. // Per message header flags to keep track of whether the user is allowing remote
  58. // content for a particular message. 
  59. // if you change or add more values to these constants, be sure to modify
  60. // the corresponding definitions in nsMsgContentPolicy.cpp
  61. const kNoRemoteContentPolicy = 0;
  62. const kBlockRemoteContent = 1;
  63. const kAllowRemoteContent = 2;
  64.  
  65. const kIsAPhishMessage = 0;
  66. const kNotAPhishMessage = 1;
  67.  
  68. const kMsgNotificationPhishingBar = 1;
  69. const kMsgNotificationJunkBar = 2;
  70. const kMsgNotificationRemoteImages = 3;
  71.  
  72. var gMessengerBundle;
  73. var gPromptService;
  74. var gOfflinePromptsBundle;
  75. var gOfflineManager;
  76. var gWindowManagerInterface;
  77. var gPrefBranch = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch(null);
  78. var gPrintSettings = null;
  79. var gWindowReuse  = 0;
  80. var gMarkViewedMessageAsReadTimer = null; // if the user has configured the app to mark a message as read if it is viewed for more than n seconds
  81.  
  82. var gTimelineService = null;
  83. var gTimelineEnabled = ("@mozilla.org;timeline-service;1" in Components.classes);
  84. if (gTimelineEnabled) {
  85.   try {
  86.     gTimelineEnabled = gPrefBranch.getBoolPref("mailnews.timeline_is_enabled");
  87.     if (gTimelineEnabled) {
  88.       gTimelineService = 
  89.         Components.classes["@mozilla.org;timeline-service;1"].getService(Components.interfaces.nsITimelineService);
  90.     }
  91.   }
  92.   catch (ex)
  93.   {
  94.     gTimelineEnabled = false;
  95.   }
  96. }
  97.  
  98. var disallow_classes_no_html = 1; /* the user preference,
  99.      if HTML is not allowed. I assume, that the user could have set this to a
  100.      value > 1 in his prefs.js or user.js, but that the value will not
  101.      change during runtime other than through the MsgBody*() functions below.*/
  102.  
  103. // Disable the new account menu item if the account preference is locked.
  104. // Two other affected areas are the account central and the account manager
  105. // dialog.
  106. function menu_new_init()
  107. {
  108.   if (!gMessengerBundle)
  109.     gMessengerBundle = document.getElementById("bundle_messenger");
  110.  
  111.   var newAccountItem = document.getElementById('newAccountMenuItem');
  112.   if (gPrefBranch.prefIsLocked("mail.disable_new_account_addition"))
  113.     newAccountItem.setAttribute("disabled","true");
  114.  
  115.   // Change "New Folder..." menu according to the context
  116.   var folderArray = GetSelectedMsgFolders();
  117.   if (folderArray.length == 0)
  118.     return;
  119.   var msgFolder = folderArray[0];
  120.   var isServer = msgFolder.isServer;
  121.   var serverType = msgFolder.server.type;
  122.   var canCreateNew = msgFolder.canCreateSubfolders;
  123.   var isInbox = IsSpecialFolder(msgFolder, MSG_FOLDER_FLAG_INBOX, false);
  124.   var isIMAPFolder = serverType == "imap";
  125.   var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  126.                          .getService(Components.interfaces.nsIIOService);
  127.   var showNew = ((serverType != 'nntp') && canCreateNew) || isInbox;
  128.   ShowMenuItem("menu_newFolder", showNew);
  129.   ShowMenuItem("menu_newVirtualFolder", showNew);
  130.   EnableMenuItem("menu_newFolder", !isIMAPFolder || !ioService.offline);
  131.   EnableMenuItem("menu_newVirtualFolder", true);
  132.   if (showNew)
  133.     SetMenuItemLabel("menu_newFolder", gMessengerBundle.getString((isServer || isInbox) ? "newFolderMenuItem" : "newSubfolderMenuItem"));
  134. }
  135.  
  136. function goUpdateMailMenuItems(commandset)
  137. {
  138. //  dump("Updating commands for " + commandset.id + "\n");
  139.  
  140.   for (var i = 0; i < commandset.childNodes.length; i++)
  141.   {
  142.     var commandID = commandset.childNodes[i].getAttribute("id");
  143.     if (commandID)
  144.     {
  145.       goUpdateCommand(commandID);
  146.     }
  147.   }
  148. }
  149.  
  150. function file_init()
  151. {
  152.   document.commandDispatcher.updateCommands('create-menu-file');
  153. }
  154.  
  155. function InitEditMessagesMenu()
  156. {
  157.   goSetMenuValue('cmd_delete', 'valueDefault');
  158.   goSetAccessKey('cmd_delete', 'valueDefaultAccessKey');
  159.   document.commandDispatcher.updateCommands('create-menu-edit');
  160. }
  161.  
  162. function InitGoMessagesMenu()
  163. {
  164.   document.commandDispatcher.updateCommands('create-menu-go');
  165. }
  166.  
  167. function view_init()
  168. {
  169.   if (!gMessengerBundle)
  170.       gMessengerBundle = document.getElementById("bundle_messenger");
  171.  
  172.   var message_menuitem = document.getElementById('menu_showMessagePane');
  173.   if (message_menuitem && !message_menuitem.hidden) {
  174.       message_menuitem.setAttribute('checked', !IsMessagePaneCollapsed());
  175.       message_menuitem.setAttribute('disabled', gAccountCentralLoaded);
  176.   }
  177.  
  178.   var folderPane_menuitem = document.getElementById('menu_showFolderPane');
  179.   if (folderPane_menuitem && !folderPane_menuitem.hidden)
  180.     folderPane_menuitem.setAttribute('checked', !IsFolderPaneCollapsed());
  181.  
  182.   // Disable some menus if account manager is showing
  183.   var sort_menuitem = document.getElementById('viewSortMenu');
  184.   if (sort_menuitem) {
  185.     sort_menuitem.setAttribute("disabled", gAccountCentralLoaded);
  186.   }
  187.   var view_menuitem = document.getElementById('viewMessageViewMenu');
  188.   if (view_menuitem) {
  189.     view_menuitem.setAttribute("disabled", gAccountCentralLoaded);
  190.   }
  191.   var threads_menuitem = document.getElementById('viewMessagesMenu');
  192.   if (threads_menuitem) {
  193.     threads_menuitem.setAttribute("disabled", gAccountCentralLoaded);
  194.   }
  195.  
  196.   // Initialize the View Attachment Inline menu
  197.   var viewAttachmentInline = pref.getBoolPref("mail.inline_attachments");
  198.   document.getElementById("viewAttachmentsInlineMenuitem").setAttribute("checked", viewAttachmentInline ? "true" : "false");
  199.  
  200.   document.commandDispatcher.updateCommands('create-menu-view');
  201. }
  202.  
  203. function InitViewLayoutStyleMenu(event)
  204. {
  205.   var paneConfig = GetMailPaneConfig();
  206.   var layoutStyleMenuitem = event.target.childNodes[paneConfig];
  207.   if (layoutStyleMenuitem)
  208.     layoutStyleMenuitem.setAttribute("checked", "true"); 
  209. }
  210.  
  211. function setSortByMenuItemCheckState(id, value)
  212. {
  213.     var menuitem = document.getElementById(id);
  214.     if (menuitem) {
  215.       menuitem.setAttribute("checked", value);
  216.     }
  217. }
  218.  
  219. function InitViewSortByMenu()
  220. {
  221.     var sortType = gDBView.sortType;
  222.  
  223.     setSortByMenuItemCheckState("sortByDateMenuitem", (sortType == nsMsgViewSortType.byDate));
  224.     setSortByMenuItemCheckState("sortByFlagMenuitem", (sortType == nsMsgViewSortType.byFlagged));
  225.     setSortByMenuItemCheckState("sortByOrderReceivedMenuitem", (sortType == nsMsgViewSortType.byId));
  226.     setSortByMenuItemCheckState("sortByPriorityMenuitem", (sortType == nsMsgViewSortType.byPriority));
  227.     setSortByMenuItemCheckState("sortBySizeMenuitem", (sortType == nsMsgViewSortType.bySize));
  228.     setSortByMenuItemCheckState("sortByStatusMenuitem", (sortType == nsMsgViewSortType.byStatus));
  229.     setSortByMenuItemCheckState("sortBySubjectMenuitem", (sortType == nsMsgViewSortType.bySubject));
  230.     setSortByMenuItemCheckState("sortByUnreadMenuitem", (sortType == nsMsgViewSortType.byUnread));
  231.     setSortByMenuItemCheckState("sortByLabelMenuitem", (sortType == nsMsgViewSortType.byLabel));
  232.     setSortByMenuItemCheckState("sortByJunkStatusMenuitem", (sortType == nsMsgViewSortType.byJunkStatus));
  233.     setSortByMenuItemCheckState("sortBySenderMenuitem", (sortType == nsMsgViewSortType.byAuthor));
  234.     setSortByMenuItemCheckState("sortByRecipientMenuitem", (sortType == nsMsgViewSortType.byRecipient));
  235.     setSortByMenuItemCheckState("sortByAttachmentsMenuitem", (sortType == nsMsgViewSortType.byAttachments));
  236.  
  237.     var sortOrder = gDBView.sortOrder;
  238.     var sortTypeSupportsGrouping = (sortType == nsMsgViewSortType.byAuthor 
  239.         || sortType == nsMsgViewSortType.byDate || sortType == nsMsgViewSortType.byPriority
  240.         || sortType == nsMsgViewSortType.bySubject || sortType == nsMsgViewSortType.byLabel
  241.         || sortType == nsMsgViewSortType.byRecipient);
  242.  
  243.     setSortByMenuItemCheckState("sortAscending", (sortOrder == nsMsgViewSortOrder.ascending));
  244.     setSortByMenuItemCheckState("sortDescending", (sortOrder == nsMsgViewSortOrder.descending));
  245.  
  246.     var grouped = ((gDBView.viewFlags & nsMsgViewFlagsType.kGroupBySort) != 0);
  247.     var threaded = ((gDBView.viewFlags & nsMsgViewFlagsType.kThreadedDisplay) != 0 && !grouped);
  248.     var sortThreadedMenuItem = document.getElementById("sortThreaded");
  249.     var sortUnthreadedMenuItem = document.getElementById("sortUnthreaded");
  250.  
  251.     sortThreadedMenuItem.setAttribute("checked", threaded);
  252.     sortUnthreadedMenuItem.setAttribute("checked", !threaded && !grouped);
  253.  
  254.     sortThreadedMenuItem.setAttribute("disabled", !gDBView.supportsThreading);
  255.     sortUnthreadedMenuItem.setAttribute("disabled", !gDBView.supportsThreading);
  256.  
  257.     var groupBySortOrderMenuItem = document.getElementById("groupBySort");
  258.  
  259.     groupBySortOrderMenuItem.setAttribute("disabled", !gDBView.supportsThreading || !sortTypeSupportsGrouping);
  260.     groupBySortOrderMenuItem.setAttribute("checked", grouped);
  261. }
  262.  
  263. function InitViewMessagesMenu()
  264. {
  265.   var viewFlags = gDBView ? gDBView.viewFlags : 0;
  266.   var viewType = gDBView ? gDBView.viewType : 0;
  267.  
  268.   var allMenuItem = document.getElementById("viewAllMessagesMenuItem");
  269.   if (allMenuItem)
  270.     allMenuItem.setAttribute("checked",  (viewFlags & nsMsgViewFlagsType.kUnreadOnly) == 0 && (viewType == nsMsgViewType.eShowAllThreads));
  271.  
  272.   var unreadMenuItem = document.getElementById("viewUnreadMessagesMenuItem");
  273.   if (unreadMenuItem)
  274.     unreadMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) != 0);
  275.  
  276.   var theadsWithUnreadMenuItem = document.getElementById("viewThreadsWithUnreadMenuItem");
  277.   if (theadsWithUnreadMenuItem)
  278.     theadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowThreadsWithUnread);
  279.  
  280.   var watchedTheadsWithUnreadMenuItem = document.getElementById("viewWatchedThreadsWithUnreadMenuItem");
  281.   if (watchedTheadsWithUnreadMenuItem)
  282.     watchedTheadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowWatchedThreadsWithUnread);
  283.   
  284.   var ignoredTheadsMenuItem = document.getElementById("viewIgnoredThreadsMenuItem");
  285.   if (ignoredTheadsMenuItem)
  286.     ignoredTheadsMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kShowIgnored) != 0);
  287. }
  288.  
  289. function InitViewMessageViewMenu()
  290. {
  291.   var currentViewValue = document.getElementById("viewPicker").value;
  292.  
  293.   var allMenuItem = document.getElementById("viewAll");
  294.   if(allMenuItem)
  295.     allMenuItem.setAttribute("checked",  currentViewValue == 0);  // from msgViewPickerOveraly.xul <menuitem value="0" id="viewPickerAll" label="&viewPickerAll.label;"/>
  296.     
  297.   var unreadMenuItem = document.getElementById("viewUnread");
  298.   if(unreadMenuItem)
  299.     unreadMenuItem.setAttribute("checked", currentViewValue == 1); // from msgViewPickerOveraly.xul, <menuitem value="1" id="viewPickerUnread" label="&viewPickerUnread.label;"/>
  300.   
  301.   for (var i = 1; i <= 5; i++) {
  302.     var prefString = gPrefBranch.getComplexValue("mailnews.labels.description." + i, Components.interfaces.nsIPrefLocalizedString).data;
  303.     var viewLabelMenuItem = document.getElementById("viewLabelMenuItem" + i);
  304.     viewLabelMenuItem.setAttribute("label", prefString);
  305.     viewLabelMenuItem.setAttribute("checked", (i == (currentViewValue - 1)));  // 1=2-1, from msgViewPickerOveraly.xul, <menuitem value="2" id="labelMenuItem1"/>
  306.   }
  307.  
  308.   viewRefreshCustomMailViews(currentViewValue);
  309. }
  310.  
  311. function viewRefreshCustomMailViews(aCurrentViewValue)
  312. {
  313.   // for each mail view in the msg view list, add a menu item
  314.   var mailViewList = Components.classes["@mozilla.org/messenger/mailviewlist;1"].getService(Components.interfaces.nsIMsgMailViewList);
  315.  
  316.   // XXX TODO, fix code in msgViewPickerOverlay.js, to be like this.
  317.   // remove any existing entries...
  318.   var menupopupNode = document.getElementById('viewMessageViewPopup');
  319.   var userDefinedItems = menupopupNode.getElementsByAttribute("userdefined","true");
  320.   for (var i=0; userDefinedItems.item(i); )
  321.   {
  322.     if (!menupopupNode.removeChild(userDefinedItems[i]))
  323.       ++i;
  324.   }
  325.   
  326.   // now rebuild the list
  327.   var numItems = mailViewList.mailViewCount; 
  328.   var viewCreateCustomViewSeparator = document.getElementById('viewCreateCustomViewSeparator');
  329.   
  330.   for (i = 0; i < numItems; i++)
  331.   {
  332.     var newMenuItem = document.createElement("menuitem");
  333.     newMenuItem.setAttribute("label", mailViewList.getMailViewAt(i).prettyName);
  334.     newMenuItem.setAttribute("userdefined", "true");
  335.     var oncommandStr = "ViewMessagesBy('userdefinedview" + (kLastDefaultViewIndex + i) + "');";  
  336.     newMenuItem.setAttribute("oncommand", oncommandStr);
  337.     var item = menupopupNode.insertBefore(newMenuItem, viewCreateCustomViewSeparator);
  338.     item.setAttribute("value",  kLastDefaultViewIndex + i); 
  339.     item.setAttribute("type",  "radio"); // for checked
  340.     item.setAttribute("name", "viewmessages");  // for checked
  341.     item.setAttribute("checked", (kLastDefaultViewIndex + i == aCurrentViewValue)); 
  342.   }
  343.  
  344.   if (!numItems)
  345.     viewCreateCustomViewSeparator.setAttribute('collapsed', true);
  346.   else
  347.     viewCreateCustomViewSeparator.removeAttribute('collapsed');
  348. }
  349.  
  350. // called by the View | Messages | Views ... menu items
  351. // see mailWindowOverlay.xul
  352. function ViewMessagesBy(id)
  353. {
  354.   var viewPicker = document.getElementById('viewPicker');
  355.   viewPicker.selectedItem = document.getElementById(id);
  356.   viewChange(viewPicker, viewPicker.value);
  357. }
  358.  
  359. function InitMessageMenu()
  360. {
  361.   var aMessage = GetFirstSelectedMessage();
  362.   var isNews = false;
  363.   if(aMessage) {
  364.       isNews = IsNewsMessage(aMessage);
  365.   }
  366.  
  367.   //We show reply to Newsgroups only for news messages.
  368.   var replyNewsgroupMenuItem = document.getElementById("replyNewsgroupMainMenu");
  369.   if(replyNewsgroupMenuItem)
  370.   {
  371.       replyNewsgroupMenuItem.setAttribute("hidden", isNews ? "" : "true");
  372.   }
  373.  
  374.   //For mail messages we say reply. For news we say ReplyToSender.
  375.   var replyMenuItem = document.getElementById("replyMainMenu");
  376.   if(replyMenuItem)
  377.   {
  378.       replyMenuItem.setAttribute("hidden", !isNews ? "" : "true");
  379.   }
  380.  
  381.   var replySenderMenuItem = document.getElementById("replySenderMainMenu");
  382.   if(replySenderMenuItem)
  383.   {
  384.       replySenderMenuItem.setAttribute("hidden", isNews ? "" : "true");
  385.   }
  386.  
  387.   // we only kill and watch threads for news
  388.   var threadMenuSeparator = document.getElementById("threadItemsSeparator");
  389.   if (threadMenuSeparator) {
  390.       threadMenuSeparator.setAttribute("hidden", isNews ? "" : "true");
  391.   }
  392.   var killThreadMenuItem = document.getElementById("killThread");
  393.   if (killThreadMenuItem) {
  394.       killThreadMenuItem.setAttribute("hidden", isNews ? "" : "true");
  395.   }
  396.   var watchThreadMenuItem = document.getElementById("watchThread");
  397.   if (watchThreadMenuItem) {
  398.       watchThreadMenuItem.setAttribute("hidden", isNews ? "" : "true");
  399.   }
  400.  
  401.   // disable the move and copy menus if there are no messages selected.
  402.   // disable the move menu if we can't delete msgs from the folder
  403.   var moveMenu = document.getElementById("moveMenu");
  404.   var msgFolder = GetLoadedMsgFolder();
  405.   if(moveMenu)
  406.   {
  407.       var enableMenuItem = aMessage && msgFolder && msgFolder.canDeleteMessages;
  408.       moveMenu.setAttribute("disabled", !enableMenuItem);
  409.   }
  410.  
  411.   var copyMenu = document.getElementById("copyMenu");
  412.   if(copyMenu)
  413.       copyMenu.setAttribute("disabled", !aMessage);
  414.  
  415.   // Disable Forward as/Label menu items if no message is selected
  416.   var forwardAsMenu = document.getElementById("forwardAsMenu");
  417.   if(forwardAsMenu)
  418.       forwardAsMenu.setAttribute("disabled", !aMessage);
  419.  
  420.   var labelMenu = document.getElementById("labelMenu");
  421.   if(labelMenu)
  422.       labelMenu.setAttribute("disabled", !aMessage);
  423.  
  424.   // Disable mark menu when we're not in a folder
  425.   var markMenu = document.getElementById("markMenu");
  426.   if(markMenu)
  427.       markMenu.setAttribute("disabled", !msgFolder);
  428.  
  429.   document.commandDispatcher.updateCommands('create-menu-message');
  430. }
  431.  
  432. function InitViewHeadersMenu()
  433. {
  434.   var id = null;
  435.   var headerchoice = 1;
  436.   try 
  437.   {
  438.     headerchoice = pref.getIntPref("mail.show_headers");
  439.   }
  440.   catch (ex) 
  441.   {
  442.     dump("failed to get the header pref\n");
  443.   }
  444.  
  445.   switch (headerchoice) 
  446.   {
  447.     case 2:    
  448.         id = "viewallheaders";
  449.         break;
  450.     case 1:    
  451.     default:
  452.         id = "viewnormalheaders";
  453.         break;
  454.   }
  455.  
  456.   var menuitem = document.getElementById(id);
  457.   if (menuitem)
  458.     menuitem.setAttribute("checked", "true"); 
  459. }
  460.  
  461. function InitViewBodyMenu()
  462. {
  463.   var html_as = 0;
  464.   var prefer_plaintext = false;
  465.   var disallow_classes = 0;
  466.   try
  467.   {
  468.     prefer_plaintext = pref.getBoolPref("mailnews.display.prefer_plaintext");
  469.     html_as = pref.getIntPref("mailnews.display.html_as");
  470.     disallow_classes =
  471.                     pref.getIntPref("mailnews.display.disallow_mime_handlers");
  472.     if (disallow_classes > 0)
  473.       disallow_classes_no_html = disallow_classes;
  474.     // else disallow_classes_no_html keeps its inital value (see top)
  475.   }
  476.   catch (ex)
  477.   {
  478.     dump("failed to get the body plaintext vs. HTML prefs\n");
  479.   }
  480.  
  481.   var AllowHTML_checked = false;
  482.   var Sanitized_checked = false;
  483.   var AsPlaintext_checked = false;
  484.   if (prefer_plaintext == false && html_as == 0 && disallow_classes == 0)
  485.     AllowHTML_checked = true;
  486.   else if (prefer_plaintext == false && html_as == 3 && disallow_classes > 0)
  487.     Sanitized_checked = true;
  488.   else if (prefer_plaintext == true && html_as == 1 && disallow_classes > 0)
  489.     AsPlaintext_checked = true;
  490.   // else (the user edited prefs/user.js) check none of the radio menu items
  491.  
  492.   var AllowHTML_menuitem = document.getElementById("bodyAllowHTML");
  493.   var Sanitized_menuitem = document.getElementById("bodySanitized");
  494.   var AsPlaintext_menuitem = document.getElementById("bodyAsPlaintext");
  495.   if (AllowHTML_menuitem
  496.       && Sanitized_menuitem
  497.       && AsPlaintext_menuitem)
  498.   {
  499.     AllowHTML_menuitem.setAttribute("checked",
  500.                                     AllowHTML_checked ? "true" : "false");
  501.     Sanitized_menuitem.setAttribute("checked",
  502.                                       Sanitized_checked ? "true" : "false");
  503.     AsPlaintext_menuitem.setAttribute("checked",
  504.                                       AsPlaintext_checked ? "true" : "false");
  505.   }
  506.   else
  507.     dump("Where is my View|Body menu?\n");
  508. }
  509.  
  510. function IsNewsMessage(messageUri)
  511. {
  512.   return (/^news-message:/.test(messageUri));
  513. }
  514.  
  515. function IsImapMessage(messageUri)
  516. {
  517.   return (/^imap-message:/.test(messageUri));
  518. }
  519.  
  520. function SetMenuItemLabel(menuItemId, customLabel)
  521. {
  522.     var menuItem = document.getElementById(menuItemId);
  523.  
  524.     if(menuItem)
  525.         menuItem.setAttribute('label', customLabel);
  526. }
  527.  
  528. function InitMessageLabel(menuType)
  529. {
  530.     /* this code gets the label strings and changes the menu labels */
  531.     var color;
  532.  
  533.     try
  534.     {
  535.         var isChecked = true;
  536.         var checkedLabel = gDBView.hdrForFirstSelectedMessage.label;
  537.     }
  538.     catch(ex)
  539.     {
  540.         isChecked = false;
  541.     }
  542.  
  543.     for (var label = 0; label <= 5; label++)
  544.     {
  545.         try
  546.         {
  547.             var prefString = gPrefBranch.getComplexValue("mailnews.labels.description." + label,
  548.                                                          Components.interfaces.nsIPrefLocalizedString);
  549.             var formattedPrefString = gMessengerBundle.getFormattedString("labelMenuItemFormat" + label,
  550.                                                                           [prefString], 1); 
  551.             var menuItemId = menuType + "-labelMenuItem" + label;
  552.             var menuItem = document.getElementById(menuItemId);
  553.  
  554.             SetMenuItemLabel(menuItemId, formattedPrefString);
  555.             if (isChecked && label == checkedLabel)
  556.               menuItem.setAttribute("checked", "true");
  557.             else
  558.               menuItem.setAttribute("checked", "false");
  559.  
  560.             // commented out for now until UE decides on how to show the Labels menu items.
  561.             // This code will color either the text or background for the Labels menu items.
  562.             /*****
  563.             if (label != 0)
  564.             {
  565.                 color = gPrefBranch.getCharPref("mailnews.labels.color." + label);
  566.                 // this colors the text of the menuitem only.
  567.                 //menuItem.setAttribute("style", ("color: " + color));
  568.  
  569.                 // this colors the background of the menuitem and
  570.                 // when selected, text becomes white.
  571.                 //menuItem.setAttribute("style", ("color: #FFFFFF"));
  572.                 //menuItem.setAttribute("style", ("background-color: " + color));
  573.             }
  574.             ****/
  575.         }
  576.         catch(ex)
  577.         {
  578.         }
  579.     }
  580.     document.commandDispatcher.updateCommands('create-menu-label');
  581. }
  582.  
  583. function InitMessageMark()
  584. {
  585.   var areMessagesRead = SelectedMessagesAreRead();
  586.   var readItem = document.getElementById("cmd_markAsRead");
  587.   if(readItem)
  588.      readItem.setAttribute("checked", areMessagesRead);
  589.  
  590.   var areMessagesFlagged = SelectedMessagesAreFlagged();
  591.   var flaggedItem = document.getElementById("cmd_markAsFlagged");
  592.   if(flaggedItem)
  593.      flaggedItem.setAttribute("checked", areMessagesFlagged);
  594.  
  595.   document.commandDispatcher.updateCommands('create-menu-mark');
  596. }
  597.  
  598. function UpdateJunkToolbarButton()
  599. {
  600.   var junkButtonDeck = document.getElementById("button-junk");
  601.   junkButtonDeck.selectedIndex = SelectedMessagesAreJunk() ? 1 : 0;
  602. }
  603.  
  604. function UpdateDeleteCommand()
  605. {
  606.   var value = "value";
  607.   var uri = GetFirstSelectedMessage();
  608.   if (IsNewsMessage(uri))
  609.     value += "News";
  610.   else if (SelectedMessagesAreDeleted())
  611.     value += "IMAPDeleted";
  612.   if (GetNumSelectedMessages() < 2)
  613.     value += "Message";
  614.   else
  615.     value += "Messages";
  616.   goSetMenuValue("cmd_delete", value);
  617.   goSetAccessKey("cmd_delete", value + "AccessKey");
  618. }
  619.  
  620. function SelectedMessagesAreDeleted()
  621. {
  622.     try {
  623.         return gDBView.hdrForFirstSelectedMessage.flags & MSG_FLAG_IMAP_DELETED;
  624.     }
  625.     catch (ex) {
  626.         return 0;
  627.     }
  628. }
  629.  
  630. function SelectedMessagesAreJunk()
  631. {
  632.     var isJunk;
  633.     try {
  634.         var junkScore = gDBView.hdrForFirstSelectedMessage.getStringProperty("junkscore");
  635.         isJunk =  ((junkScore != "") && (junkScore != "0"));
  636.     }
  637.     catch (ex) {
  638.         isJunk = false;
  639.     }
  640.     return isJunk;
  641. }
  642.  
  643. function SelectedMessagesAreRead()
  644. {
  645.     var isRead;
  646.     try {
  647.         isRead = gDBView.hdrForFirstSelectedMessage.isRead;
  648.     }
  649.     catch (ex) {
  650.         isRead = false;
  651.     }
  652.     return isRead;
  653. }
  654.  
  655. function SelectedMessagesAreFlagged()
  656. {
  657.     var isFlagged;
  658.     try {
  659.         isFlagged = gDBView.hdrForFirstSelectedMessage.isFlagged;
  660.     }
  661.     catch (ex) {
  662.         isFlagged = false;
  663.     }
  664.     return isFlagged;
  665. }
  666.  
  667. function getMsgToolbarMenu_init()
  668. {
  669.     document.commandDispatcher.updateCommands('create-menu-getMsgToolbar');
  670. }
  671.  
  672. function GetFirstSelectedMsgFolder()
  673. {
  674.     var result = null;
  675.     var selectedFolders = GetSelectedMsgFolders();
  676.     if (selectedFolders.length > 0) {
  677.         result = selectedFolders[0];
  678.     }
  679.  
  680.     return result;
  681. }
  682.  
  683. function GetWindowMediator()
  684. {
  685.     if (gWindowManagerInterface)
  686.         return gWindowManagerInterface;
  687.  
  688.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  689.     return (gWindowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator));
  690. }
  691.  
  692. function GetInboxFolder(server)
  693. {
  694.     try {
  695.         var rootMsgFolder = server.rootMsgFolder;
  696.  
  697.         //now find Inbox
  698.         var outNumFolders = new Object();
  699.         var inboxFolder = rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders);
  700.  
  701.         return inboxFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
  702.     }
  703.     catch (ex) {
  704.         dump(ex + "\n");
  705.     }
  706.     return null;
  707. }
  708.  
  709. function GetMessagesForInboxOnServer(server)
  710. {
  711.   dump ("GetMessagesForInboxOnServer uri = " + server.serverURI + "\n");
  712.   var inboxFolder = GetInboxFolder(server);
  713.   if (!inboxFolder) return;
  714.  
  715.   var folders = new Array(1);
  716.   folders[0] = inboxFolder;
  717.  
  718.   var compositeDataSource = GetCompositeDataSource("GetNewMessages");
  719.   GetNewMessages(folders, server, compositeDataSource);
  720. }
  721.  
  722. function MsgGetMessage()
  723. {
  724.   // if offline, prompt for getting messages
  725.   if(CheckOnline())
  726.     GetFolderMessages();
  727.   else if (DoGetNewMailWhenOffline())
  728.       GetFolderMessages();
  729.     }
  730.  
  731. function MsgGetMessagesForAllServers(defaultServer)
  732. {
  733.     // now log into any server
  734.     try
  735.     {
  736.         var allServers = accountManager.allServers;
  737.         var i;
  738.         // array of isupportsarrays of servers for a particular folder
  739.         var pop3DownloadServersArray = new Array();
  740.         // parallel isupports array of folders to download to...
  741.         var localFoldersToDownloadTo = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  742.         var pop3Server;
  743.  
  744.         for (i = 0; i < allServers.Count(); ++i)
  745.         {
  746.             var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
  747.             var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + currentServer.type].getService(Components.interfaces.nsIMsgProtocolInfo);
  748.             if (protocolinfo.canLoginAtStartUp && currentServer.loginAtStartUp)
  749.             {
  750.                 if (defaultServer && defaultServer.equals(currentServer) && 
  751.                   !defaultServer.isDeferredTo &&
  752.                   defaultServer.rootFolder == defaultServer.rootMsgFolder)
  753.                 {
  754.                     dump(currentServer.serverURI + "...skipping, already opened\n");
  755.                 }
  756.                 else if (currentServer.type == "pop3" && currentServer.downloadOnBiff)
  757.                 {
  758.                     CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo);
  759.                     pop3Server = currentServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
  760.                 }
  761.                 else
  762.                 {
  763.                     // Check to see if there are new messages on the server
  764.                     currentServer.PerformBiff(msgWindow);
  765.                 }
  766.             }
  767.         }
  768.         for (i = 0; i < pop3DownloadServersArray.length; ++i)
  769.         {
  770.           // any ol' pop3Server will do - the serversArray specifies which servers to download from
  771.           pop3Server.downloadMailFromServers(pop3DownloadServersArray[i], msgWindow, localFoldersToDownloadTo.GetElementAt(i), null);
  772.         }
  773.     }
  774.     catch(ex)
  775.     {
  776.         dump(ex + "\n");
  777.     }
  778. }
  779.  
  780. /**
  781.   * Get messages for all those accounts which have the capability
  782.   * of getting messages and have session password available i.e.,
  783.   * curretnly logged in accounts.
  784.   * if offline, prompt for getting messages.
  785.   */
  786. function MsgGetMessagesForAllAuthenticatedAccounts()
  787. {
  788.   if(CheckOnline())
  789.     GetMessagesForAllAuthenticatedAccounts();
  790.   else if (DoGetNewMailWhenOffline())
  791.       GetMessagesForAllAuthenticatedAccounts();
  792.     }
  793.  
  794. /**
  795.   * Get messages for the account selected from Menu dropdowns.
  796.   * if offline, prompt for getting messages.
  797.   */
  798. function MsgGetMessagesForAccount(aEvent)
  799. {
  800.   if (!aEvent)
  801.     return;
  802.  
  803.   if(CheckOnline())
  804.     GetMessagesForAccount(aEvent);
  805.   else if (DoGetNewMailWhenOffline()) 
  806.       GetMessagesForAccount(aEvent);
  807.     }
  808.  
  809. // if offline, prompt for getNextNMessages
  810. function MsgGetNextNMessages()
  811. {
  812.   var folder;
  813.   
  814.   if(CheckOnline()) {
  815.     folder = GetFirstSelectedMsgFolder();
  816.     if(folder) 
  817.       GetNextNMessages(folder);
  818.   }
  819.  
  820.   else if(DoGetNewMailWhenOffline()) {
  821.       folder = GetFirstSelectedMsgFolder();
  822.       if(folder) {
  823.         GetNextNMessages(folder);
  824.       }
  825.     }
  826.   }   
  827.  
  828. function MsgDeleteMessage(reallyDelete, fromToolbar)
  829. {
  830.     // if from the toolbar, return right away if this is a news message
  831.     // only allow cancel from the menu:  "Edit | Cancel / Delete Message"
  832.     if (fromToolbar)
  833.     {
  834.         var srcFolder = GetLoadedMsgFolder();
  835.         var folderResource = srcFolder.QueryInterface(Components.interfaces.nsIRDFResource);
  836.         var uri = folderResource.Value;
  837.         if (isNewsURI(uri)) {
  838.             // if news, don't delete
  839.             return;
  840.         }
  841.     }
  842.  
  843.     SetNextMessageAfterDelete();
  844.     if (reallyDelete) {
  845.         gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
  846.     }
  847.     else {
  848.         gDBView.doCommand(nsMsgViewCommandType.deleteMsg);
  849.     }
  850. }
  851.  
  852. function MsgCopyMessage(destFolder)
  853. {
  854.   try {
  855.     // get the msg folder we're copying messages into
  856.     var destUri = destFolder.getAttribute('id');
  857.     var destResource = RDF.GetResource(destUri);
  858.     var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  859.     gDBView.doCommandWithFolder(nsMsgViewCommandType.copyMessages, destMsgFolder);
  860.   }
  861.   catch (ex) {
  862.     dump("MsgCopyMessage failed: " + ex + "\n");
  863.   }
  864. }
  865.  
  866. function MsgMoveMessage(destFolder)
  867. {
  868.   try {
  869.     // get the msg folder we're moving messages into
  870.     var destUri = destFolder.getAttribute('id');
  871.     var destResource = RDF.GetResource(destUri);
  872.     var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder);
  873.     // we don't move news messages, we copy them
  874.     if (isNewsURI(gDBView.msgFolder.URI)) {
  875.       gDBView.doCommandWithFolder(nsMsgViewCommandType.copyMessages, destMsgFolder);
  876.     }
  877.     else {
  878.       SetNextMessageAfterDelete();
  879.       gDBView.doCommandWithFolder(nsMsgViewCommandType.moveMessages, destMsgFolder);
  880.     }
  881.   }
  882.   catch (ex) {
  883.     dump("MsgMoveMessage failed: " + ex + "\n");
  884.   }
  885. }
  886.  
  887. function MsgNewMessage(event)
  888. {
  889.   var loadedFolder = GetFirstSelectedMsgFolder();
  890.   var messageArray = GetSelectedMessages();
  891.  
  892.   if (event && event.shiftKey)
  893.     ComposeMessage(msgComposeType.New, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  894.   else
  895.     ComposeMessage(msgComposeType.New, msgComposeFormat.Default, loadedFolder, messageArray);
  896. }
  897.  
  898. function MsgReplyMessage(event)
  899. {
  900.   var loadedFolder = GetLoadedMsgFolder();
  901.   if (loadedFolder)
  902.   {
  903.     var server = loadedFolder.server;
  904.  
  905.     if (server && server.type == "nntp")
  906.     {
  907.       MsgReplyGroup(event);
  908.       return;
  909.     }
  910.   }
  911.   MsgReplySender(event);
  912. }
  913.  
  914. function MsgReplySender(event)
  915. {
  916.   var loadedFolder = GetLoadedMsgFolder();
  917.   var messageArray = GetSelectedMessages();
  918.  
  919.   ComposeMessage(msgComposeType.ReplyToSender,
  920.     (event && event.shiftKey) ? msgComposeFormat.OppositeOfDefault : msgComposeFormat.Default,
  921.     loadedFolder, messageArray);
  922. }
  923.  
  924. function MsgReplyGroup(event)
  925. {
  926.   var loadedFolder = GetLoadedMsgFolder();
  927.   var messageArray = GetSelectedMessages();
  928.  
  929.   if (event && event.shiftKey)
  930.     ComposeMessage(msgComposeType.ReplyToGroup, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  931.   else
  932.     ComposeMessage(msgComposeType.ReplyToGroup, msgComposeFormat.Default, loadedFolder, messageArray);
  933. }
  934.  
  935. function MsgReplyToAllMessage(event)
  936. {
  937.   var loadedFolder = GetLoadedMsgFolder();
  938.   var messageArray = GetSelectedMessages();
  939.  
  940.   if (event && event.shiftKey)
  941.     ComposeMessage(msgComposeType.ReplyAll, msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  942.   else
  943.     ComposeMessage(msgComposeType.ReplyAll, msgComposeFormat.Default, loadedFolder, messageArray);
  944. }
  945.  
  946. function MsgForwardMessage(event)
  947. {
  948.   var forwardType = 0;
  949.   try {
  950.     forwardType = gPrefBranch.getIntPref("mail.forward_message_mode");
  951.   }
  952.   catch (ex) {
  953.     dump("failed to retrieve pref mail.forward_message_mode");
  954.   }
  955.  
  956.   // mail.forward_message_mode could be 1, if the user migrated from 4.x
  957.   // 1 (forward as quoted) is obsolete, so we treat is as forward inline
  958.   // since that is more like forward as quoted then forward as attachment
  959.   if (forwardType == 0)
  960.       MsgForwardAsAttachment(event);
  961.   else
  962.       MsgForwardAsInline(event);
  963. }
  964.  
  965. function MsgForwardAsAttachment(event)
  966. {
  967.   var loadedFolder = GetLoadedMsgFolder();
  968.   var messageArray = GetSelectedMessages();
  969.  
  970.   //dump("\nMsgForwardAsAttachment from XUL\n");
  971.   if (event && event.shiftKey)
  972.     ComposeMessage(msgComposeType.ForwardAsAttachment,
  973.                    msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  974.   else
  975.     ComposeMessage(msgComposeType.ForwardAsAttachment, msgComposeFormat.Default, loadedFolder, messageArray);
  976. }
  977.  
  978. function MsgForwardAsInline(event)
  979. {
  980.   var loadedFolder = GetLoadedMsgFolder();
  981.   var messageArray = GetSelectedMessages();
  982.  
  983.   //dump("\nMsgForwardAsInline from XUL\n");
  984.   if (event && event.shiftKey)
  985.     ComposeMessage(msgComposeType.ForwardInline,
  986.                    msgComposeFormat.OppositeOfDefault, loadedFolder, messageArray);
  987.   else
  988.     ComposeMessage(msgComposeType.ForwardInline, msgComposeFormat.Default, loadedFolder, messageArray);
  989. }
  990.  
  991.  
  992. function MsgEditMessageAsNew()
  993. {
  994.     var loadedFolder = GetLoadedMsgFolder();
  995.     var messageArray = GetSelectedMessages();
  996.     ComposeMessage(msgComposeType.Template, msgComposeFormat.Default, loadedFolder, messageArray);
  997. }
  998.  
  999. function MsgCreateFilter()
  1000. {
  1001.   // retrieve Sender direct from selected message's headers
  1002.   var msgHdr = gDBView.hdrForFirstSelectedMessage;
  1003.   var headerParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser);
  1004.   var emailAddress = headerParser.extractHeaderAddressMailboxes(null, msgHdr.author);
  1005.   var accountKey = msgHdr.accountKey;
  1006.   var folder;
  1007.   if (accountKey.length > 0)
  1008.   {
  1009.     var account = accountManager.getAccount(accountKey);
  1010.     if (account)
  1011.     {
  1012.       server = account.incomingServer;
  1013.       if (server)
  1014.         folder = server.rootFolder;
  1015.     }
  1016.   }
  1017.   if (!folder)
  1018.     folder = GetFirstSelectedMsgFolder();
  1019.   
  1020.     if (emailAddress)
  1021.      top.MsgFilters(emailAddress, folder);
  1022. }
  1023.  
  1024. function MsgHome(url)
  1025. {
  1026.   window.open(url, "_blank", "chrome,dependent=yes,all");
  1027. }
  1028.  
  1029. function MsgNewFolder(callBackFunctionName)
  1030. {
  1031.     var preselectedFolder = GetFirstSelectedMsgFolder();
  1032.     var dualUseFolders = true;
  1033.     var server = null;
  1034.     var destinationFolder = null;
  1035.  
  1036.     if (preselectedFolder)
  1037.     {
  1038.         try {
  1039.             server = preselectedFolder.server;
  1040.             if (server)
  1041.             {
  1042.                 destinationFolder = getDestinationFolder(preselectedFolder, server);
  1043.  
  1044.                 var imapServer =
  1045.                     server.QueryInterface(Components.interfaces.nsIImapIncomingServer);
  1046.                 if (imapServer)
  1047.                     dualUseFolders = imapServer.dualUseFolders;
  1048.             }
  1049.         } catch (e) {
  1050.             dump ("Exception: dualUseFolders = true\n");
  1051.         }
  1052.     }
  1053.     CreateNewSubfolder("chrome://messenger/content/newFolderDialog.xul", destinationFolder, dualUseFolders, callBackFunctionName);
  1054. }
  1055.  
  1056. function getDestinationFolder(preselectedFolder, server)
  1057. {
  1058.     var destinationFolder = null;
  1059.  
  1060.     var isCreateSubfolders = preselectedFolder.canCreateSubfolders;
  1061.     if (!isCreateSubfolders)
  1062.     {
  1063.         destinationFolder = server.rootMsgFolder;
  1064.  
  1065.         var verifyCreateSubfolders = null;
  1066.         if (destinationFolder)
  1067.             verifyCreateSubfolders = destinationFolder.canCreateSubfolders;
  1068.  
  1069.         // in case the server cannot have subfolders,
  1070.         // get default account and set its incoming server as parent folder
  1071.         if (!verifyCreateSubfolders)
  1072.         {
  1073.             try {
  1074.                 var defaultFolder = GetDefaultAccountRootFolder();
  1075.                 var checkCreateSubfolders = null;
  1076.                 if (defaultFolder)
  1077.                     checkCreateSubfolders = defaultFolder.canCreateSubfolders;
  1078.  
  1079.                 if (checkCreateSubfolders)
  1080.                     destinationFolder = defaultFolder;
  1081.  
  1082.             } catch (e) {
  1083.                 dump ("Exception: defaultAccount Not Available\n");
  1084.             }
  1085.         }
  1086.     }
  1087.     else
  1088.         destinationFolder = preselectedFolder;
  1089.  
  1090.     return destinationFolder;
  1091. }
  1092.  
  1093. function MsgSubscribe()
  1094. {
  1095.     var preselectedFolder = GetFirstSelectedMsgFolder();
  1096.     Subscribe(preselectedFolder);
  1097. }
  1098.  
  1099. function ConfirmUnsubscribe(folder)
  1100. {
  1101.     if (!gMessengerBundle)
  1102.         gMessengerBundle = document.getElementById("bundle_messenger");
  1103.  
  1104.     var titleMsg = gMessengerBundle.getString("confirmUnsubscribeTitle");
  1105.     var dialogMsg = gMessengerBundle.getFormattedString("confirmUnsubscribeText",
  1106.                                         [folder.name], 1);
  1107.  
  1108.     var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
  1109.     return promptService.confirm(window, titleMsg, dialogMsg);
  1110. }
  1111.  
  1112. function MsgUnsubscribe()
  1113. {
  1114.     var folder = GetFirstSelectedMsgFolder();
  1115.     if (ConfirmUnsubscribe(folder)) {
  1116.         UnSubscribe(folder);
  1117.     }
  1118. }
  1119.  
  1120. function MsgSaveAsFile()
  1121. {
  1122.     if (GetNumSelectedMessages() == 1) {
  1123.         SaveAsFile(GetFirstSelectedMessage());
  1124.     }
  1125. }
  1126.  
  1127. function MsgSaveAsTemplate()
  1128. {
  1129.     var folder = GetLoadedMsgFolder();
  1130.     if (GetNumSelectedMessages() == 1) {
  1131.         SaveAsTemplate(GetFirstSelectedMessage(), folder);
  1132.     }
  1133. }
  1134.  
  1135. const nsIFilePicker = Components.interfaces.nsIFilePicker;
  1136.  
  1137. function MsgOpenFromFile()
  1138. {
  1139.    var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1140.  
  1141.    var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].getService();
  1142.    strBundleService = strBundleService.QueryInterface(Components.interfaces.nsIStringBundleService);
  1143.    var extbundle = strBundleService.createBundle("chrome://messenger/locale/messenger.properties");
  1144.    var filterLabel = extbundle.GetStringFromName("EMLFiles");
  1145.    var windowTitle = extbundle.GetStringFromName("OpenEMLFiles");
  1146.  
  1147.    fp.init(window, windowTitle, nsIFilePicker.modeOpen);
  1148.    fp.appendFilter(filterLabel, "*.eml; *.msg");
  1149.  
  1150.    // Default or last filter is "All Files"
  1151.    fp.appendFilters(nsIFilePicker.filterAll);
  1152.  
  1153.   try {
  1154.      var ret = fp.show();
  1155.      if (ret == nsIFilePicker.returnCancel)
  1156.        return;
  1157.    }
  1158.    catch (ex) {
  1159.      dump("filePicker.chooseInputFile threw an exception\n");
  1160.      return;
  1161.    }
  1162.  
  1163.   var uri = fp.fileURL;
  1164.   uri.query = "type=application/x-message-display";
  1165.  
  1166.   window.openDialog( "chrome://messenger/content/messageWindow.xul", "_blank", "all,chrome,dialog=no,status,toolbar", uri, null, null );
  1167. }
  1168.  
  1169. function MsgOpenNewWindowForMsgHdr(hdr)
  1170. {
  1171.   MsgOpenNewWindowForFolder(hdr.folder.URI, hdr.messageKey);
  1172. }
  1173.  
  1174. function MsgOpenNewWindowForFolder(uri, key)
  1175. {
  1176.   var uriToOpen = uri;
  1177.   var keyToSelect = key;
  1178.  
  1179.   if (!uriToOpen)
  1180.     // use GetSelectedFolderURI() to find out which message to open instead of
  1181.     // GetLoadedMsgFolder().QueryIntervace(Components.interfaces.nsIRDFResource).value.
  1182.     // This is required because on a right-click, the currentIndex value will be
  1183.     // different from the actual row that is highlighted.  GetSelectedFolderURI()
  1184.     // will return the message that is highlighted.
  1185.     uriToOpen = GetSelectedFolderURI();
  1186.  
  1187.   if (uriToOpen) {
  1188.    // get the messenger window open service and ask it to open a new window for us
  1189.    var mailWindowService = Components.classes["@mozilla.org/messenger/windowservice;1"].getService(Components.interfaces.nsIMessengerWindowService);
  1190.    if (mailWindowService)
  1191.      mailWindowService.openMessengerWindowWithUri("mail:3pane", uriToOpen, keyToSelect);
  1192.   }
  1193. }
  1194.  
  1195. // passing in the view, so this will work for search and the thread pane
  1196. function MsgOpenSelectedMessages()
  1197. {
  1198.   var dbView = GetDBView();
  1199.  
  1200.   var indices = GetSelectedIndices(dbView);
  1201.   var numMessages = indices.length;
  1202.  
  1203.   gWindowReuse = gPrefBranch.getBoolPref("mailnews.reuse_message_window");
  1204.   // This is a radio type button pref, currently with only 2 buttons.
  1205.   // We need to keep the pref type as 'bool' for backwards compatibility
  1206.   // with 4.x migrated prefs.  For future radio button(s), please use another
  1207.   // pref (either 'bool' or 'int' type) to describe it.
  1208.   //
  1209.   // gWindowReuse values: false, true
  1210.   //    false: open new standalone message window for each message
  1211.   //    true : reuse existing standalone message window for each message
  1212.   if (gWindowReuse && numMessages == 1 && MsgOpenSelectedMessageInExistingWindow())
  1213.     return;
  1214.     
  1215.   var openWindowWarning = gPrefBranch.getIntPref("mailnews.open_window_warning");
  1216.   if ((openWindowWarning > 1) && (numMessages >= openWindowWarning)) {
  1217.     InitPrompts();
  1218.     if (!gMessengerBundle)
  1219.         gMessengerBundle = document.getElementById("bundle_messenger");
  1220.     var title = gMessengerBundle.getString("openWindowWarningTitle");
  1221.     var text = gMessengerBundle.getFormattedString("openWindowWarningText", [numMessages]);
  1222.     if (!gPromptService.confirm(window, title, text))
  1223.       return;
  1224.   }
  1225.  
  1226.   for (var i = 0; i < numMessages; i++) {
  1227.     MsgOpenNewWindowForMessage(dbView.getURIForViewIndex(indices[i]), dbView.getFolderForViewIndex(indices[i]).URI);
  1228.   }
  1229. }
  1230.  
  1231. function MsgOpenSelectedMessageInExistingWindow()
  1232. {
  1233.     var windowID = GetWindowByWindowType("mail:messageWindow");
  1234.     if (!windowID)
  1235.       return false;
  1236.  
  1237.     try {
  1238.         var messageURI = gDBView.URIForFirstSelectedMessage;
  1239.         var msgHdr = gDBView.hdrForFirstSelectedMessage;
  1240.  
  1241.         // Reset the window's message uri and folder uri vars, and
  1242.         // update the command handlers to what's going to be used.
  1243.         // This has to be done before the call to CreateView().
  1244.         windowID.gCurrentMessageUri = messageURI;
  1245.         windowID.gCurrentFolderUri = msgHdr.folder.URI;
  1246.         windowID.UpdateMailToolbar('MsgOpenExistingWindowForMessage');
  1247.  
  1248.         // even if the folder uri's match, we can't use the existing view
  1249.         // (msgHdr.folder.URI == windowID.gCurrentFolderUri)
  1250.         // the reason is quick search and mail views.
  1251.         // see bug #187673
  1252.         //
  1253.         // for the sake of simplicity,
  1254.         // let's always call CreateView(gDBView)
  1255.         // which will clone gDBView
  1256.         windowID.CreateView(gDBView);
  1257.         windowID.LoadMessageByMsgKey(msgHdr.messageKey);
  1258.  
  1259.         // bring existing window to front
  1260.         windowID.focus();
  1261.         return true;
  1262.     }
  1263.     catch (ex) {
  1264.         dump("reusing existing standalone message window failed: " + ex + "\n");
  1265.     }
  1266.     return false;
  1267. }
  1268.  
  1269. function MsgOpenNewWindowForMessage(messageUri, folderUri)
  1270. {
  1271.     if (!messageUri)
  1272.         // use GetFirstSelectedMessage() to find out which message to open
  1273.         // instead of gDBView.getURIForViewIndex(currentIndex).  This is
  1274.         // required because on a right-click, the currentIndex value will be
  1275.         // different from the actual row that is highlighted.
  1276.         // GetFirstSelectedMessage() will return the message that is
  1277.         // highlighted.
  1278.         messageUri = GetFirstSelectedMessage();
  1279.  
  1280.     if (!folderUri)
  1281.         // use GetSelectedFolderURI() to find out which message to open
  1282.         // instead of gDBView.getURIForViewIndex(currentIndex).  This is
  1283.         // required because on a right-click, the currentIndex value will be
  1284.         // different from the actual row that is highlighted.
  1285.         // GetSelectedFolderURI() will return the message that is
  1286.         // highlighted.
  1287.         folderUri = GetSelectedFolderURI();
  1288.  
  1289.     // be sure to pass in the current view....
  1290.     if (messageUri && folderUri) {
  1291.         window.openDialog( "chrome://messenger/content/messageWindow.xul", "_blank", "all,chrome,dialog=no,status,toolbar", messageUri, folderUri, gDBView );
  1292.     }
  1293. }
  1294.  
  1295. function CloseMailWindow()
  1296. {
  1297.     //dump("\nClose from XUL\nDo something...\n");
  1298.     window.close();
  1299. }
  1300.  
  1301. function MsgJunk()
  1302. {
  1303.   MsgJunkMailInfo(true);
  1304.   JunkSelectedMessages(!SelectedMessagesAreJunk());
  1305. }
  1306.  
  1307. function MsgMarkMsgAsRead(markRead)
  1308. {
  1309.     if (!markRead) {
  1310.         markRead = !SelectedMessagesAreRead();
  1311.     }
  1312.     MarkSelectedMessagesRead(markRead);
  1313. }
  1314.  
  1315. function MsgMarkAsFlagged(markFlagged)
  1316. {
  1317.     if (!markFlagged) {
  1318.         markFlagged = !SelectedMessagesAreFlagged();
  1319.     }
  1320.     MarkSelectedMessagesFlagged(markFlagged);
  1321. }
  1322.  
  1323. function MsgMarkReadByDate()
  1324. {
  1325.     window.openDialog( "chrome://messenger/content/markByDate.xul","",
  1326.                        "chrome,modal,titlebar,centerscreen",
  1327.                        GetLoadedMsgFolder() );
  1328. }
  1329.  
  1330. function MsgMarkAllRead()
  1331. {
  1332.     var compositeDataSource = GetCompositeDataSource("MarkAllMessagesRead");
  1333.     var folder = GetMsgFolderFromUri(GetSelectedFolderURI(), true);
  1334.  
  1335.     if(folder)
  1336.         MarkAllMessagesRead(compositeDataSource, folder);
  1337. }
  1338.  
  1339. function MsgDownloadFlagged()
  1340. {
  1341.   gDBView.doCommand(nsMsgViewCommandType.downloadFlaggedForOffline);
  1342. }
  1343.  
  1344. function MsgDownloadSelected()
  1345. {
  1346.   gDBView.doCommand(nsMsgViewCommandType.downloadSelectedForOffline);
  1347. }
  1348.  
  1349. function MsgMarkThreadAsRead()
  1350. {
  1351.   gDBView.doCommand(nsMsgViewCommandType.markThreadRead);
  1352. }
  1353.  
  1354. function MsgViewPageSource()
  1355. {
  1356.     var messages = GetSelectedMessages();
  1357.     ViewPageSource(messages);
  1358. }
  1359.  
  1360. var gFindInstData;
  1361. function getFindInstData()
  1362. {
  1363.   if (!gFindInstData) {
  1364.     gFindInstData = new nsFindInstData();
  1365.     gFindInstData.browser = getMessageBrowser();
  1366.     gFindInstData.rootSearchWindow = window.top.content;
  1367.     gFindInstData.currentSearchWindow = window.top.content;
  1368.   }
  1369.   return gFindInstData;
  1370. }
  1371.  
  1372. function MsgFind()
  1373. {
  1374.   findInPage(getFindInstData());
  1375. }
  1376.  
  1377. function MsgFindAgain(reverse)
  1378. {
  1379.   findAgainInPage(getFindInstData(), reverse);
  1380. }
  1381.  
  1382. function MsgCanFindAgain()
  1383. {
  1384.   return canFindAgainInPage();
  1385. }
  1386.  
  1387. function MsgFilters(emailAddress, folder)
  1388. {
  1389.     if (!folder)
  1390.       folder = GetFirstSelectedMsgFolder();
  1391.     var args;
  1392.     if (emailAddress)
  1393.     {
  1394.       /* we have to do prefill filter so we are going to 
  1395.          launch the filterEditor dialog
  1396.          and prefill that with the emailAddress */
  1397.          
  1398.       var curFilterList = folder.getFilterList(msgWindow);
  1399.       args = {filterList: curFilterList};
  1400.       args.filterName = emailAddress;
  1401.       window.openDialog("chrome://messenger/content/FilterEditor.xul", "", 
  1402.                         "chrome, modal, resizable,centerscreen,dialog=yes", args);
  1403.  
  1404.       /* if the user hits ok in the filterEditor dialog we set 
  1405.          args.refresh=true there
  1406.          we check this here in args to show filterList dialog */
  1407.       if ("refresh" in args && args.refresh)
  1408.       {
  1409.          args = { refresh: true, folder: folder };
  1410.          MsgFilterList(args);
  1411.       }
  1412.     }
  1413.     else  // just launch filterList dialog
  1414.     {
  1415.       args = { refresh: false, folder: folder };
  1416.       MsgFilterList(args);
  1417.     }
  1418. }
  1419.  
  1420. function MsgApplyFilters()
  1421. {
  1422.   var filterService = Components.classes["@mozilla.org/messenger/services/filters;1"].getService(Components.interfaces.nsIMsgFilterService);
  1423.  
  1424.   var preselectedFolder = GetFirstSelectedMsgFolder();
  1425.   var selectedFolders = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  1426.   selectedFolders.AppendElement(preselectedFolder);
  1427.          
  1428.   var curFilterList = preselectedFolder.getFilterList(msgWindow);
  1429.   // create a new filter list and copy over the enabled filters to it.
  1430.   // We do this instead of having the filter after the fact code ignore
  1431.   // disabled filters because the Filter Dialog filter after the fact
  1432.   // code would have to clone filters to allow disabled filters to run,
  1433.   // and we don't support cloning filters currently.
  1434.   var tempFilterList = filterService.getTempFilterList(preselectedFolder);
  1435.   var numFilters = curFilterList.filterCount;
  1436.   // make sure the temp filter list uses the same log stream
  1437.   tempFilterList.logStream = curFilterList.logStream;
  1438.   tempFilterList.loggingEnabled = curFilterList.loggingEnabled;
  1439.   var newFilterIndex = 0;
  1440.   for (var i = 0; i < numFilters; i++)
  1441.   {
  1442.     var curFilter = curFilterList.getFilterAt(i);
  1443.     if (curFilter.enabled)
  1444.     {
  1445.       tempFilterList.insertFilterAt(newFilterIndex, curFilter);
  1446.       newFilterIndex++;
  1447.     }
  1448.   }
  1449.   filterService.applyFiltersToFolders(tempFilterList, selectedFolders, msgWindow);
  1450. }
  1451.  
  1452. function ChangeMailLayout(newLayout)
  1453. {
  1454.   gPrefBranch.setIntPref("mail.pane_config.dynamic", newLayout);
  1455. }
  1456.  
  1457. function MsgViewAllHeaders()
  1458. {
  1459.     gPrefBranch.setIntPref("mail.show_headers",2);
  1460.     MsgReload();
  1461.     return true;
  1462. }
  1463.  
  1464. function MsgViewNormalHeaders()
  1465. {
  1466.     gPrefBranch.setIntPref("mail.show_headers",1);
  1467.     MsgReload();
  1468.     return true;
  1469. }
  1470.  
  1471. function MsgViewBriefHeaders()
  1472. {
  1473.     gPrefBranch.setIntPref("mail.show_headers",0);
  1474.     MsgReload();
  1475.     return true;
  1476. }
  1477.  
  1478. function MsgBodyAllowHTML()
  1479. {
  1480.     gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", false);
  1481.     gPrefBranch.setIntPref("mailnews.display.html_as", 0);
  1482.     gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers", 0);
  1483.     MsgReload();
  1484.     return true;
  1485. }
  1486.  
  1487. function MsgBodySanitized()
  1488. {
  1489.     gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", false);
  1490.     gPrefBranch.setIntPref("mailnews.display.html_as", 3);
  1491.     gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers",
  1492.                            disallow_classes_no_html);
  1493.     MsgReload();
  1494.     return true;
  1495. }
  1496.  
  1497. function MsgBodyAsPlaintext()
  1498. {
  1499.     gPrefBranch.setBoolPref("mailnews.display.prefer_plaintext", true);
  1500.     gPrefBranch.setIntPref("mailnews.display.html_as", 1);
  1501.     gPrefBranch.setIntPref("mailnews.display.disallow_mime_handlers",
  1502.                            disallow_classes_no_html);
  1503.     MsgReload();
  1504.     return true;
  1505. }
  1506.  
  1507. function ToggleInlineAttachment(target)
  1508. {
  1509.     var viewAttachmentInline = !pref.getBoolPref("mail.inline_attachments");
  1510.     pref.setBoolPref("mail.inline_attachments", viewAttachmentInline)
  1511.     target.setAttribute("checked", viewAttachmentInline ? "true" : "false");
  1512.     
  1513.     MsgReload();
  1514. }
  1515.  
  1516. function MsgReload()
  1517. {
  1518.     ReloadMessage();
  1519. }
  1520.  
  1521. function MsgStop()
  1522. {
  1523.     StopUrls();
  1524. }
  1525.  
  1526. function MsgSendUnsentMsgs()
  1527. {
  1528.   // if offline, prompt for sendUnsentMessages
  1529.   if(CheckOnline()) {
  1530.     SendUnsentMessages();    
  1531.   }
  1532.   else {
  1533.     var option = PromptSendMessagesOffline();
  1534.     if(option == 0) {
  1535.       if (!gOfflineManager) 
  1536.         GetOfflineMgrService();
  1537.       gOfflineManager.goOnline(false /* sendUnsentMessages */, 
  1538.                                false /* playbackOfflineImapOperations */, 
  1539.                                msgWindow);
  1540.       SendUnsentMessages();
  1541.     }
  1542.   }
  1543. }
  1544.  
  1545. function GetPrintSettings()
  1546. {
  1547.   var prevPS = gPrintSettings;
  1548.  
  1549.   try {
  1550.     if (gPrintSettings == null) {
  1551.       var useGlobalPrintSettings = gPrefBranch.getBoolPref("print.use_global_printsettings");
  1552.  
  1553.       // I would rather be using nsIWebBrowserPrint API
  1554.       // but I really don't have a document at this point
  1555.       var printSettingsService = Components.classes["@mozilla.org/gfx/printsettings-service;1"]
  1556.                                            .getService(Components.interfaces.nsIPrintSettingsService);
  1557.       if (useGlobalPrintSettings) {
  1558.         gPrintSettings = printSettingsService.globalPrintSettings;
  1559.       } else {
  1560.         gPrintSettings = printSettingsService.CreatePrintSettings();
  1561.       }
  1562.     }
  1563.   } catch (e) {
  1564.     dump("GetPrintSettings "+e);
  1565.   }
  1566.  
  1567.   return gPrintSettings;
  1568. }
  1569.  
  1570. function PrintEnginePrintInternal(messageList, numMessages, doPrintPreview, msgType)
  1571. {
  1572.     if (numMessages == 0) {
  1573.         dump("PrintEnginePrint(): No messages selected.\n");
  1574.         return false;
  1575.     }
  1576.  
  1577.     if (gPrintSettings == null) {
  1578.       gPrintSettings = GetPrintSettings();
  1579.     }
  1580.     printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
  1581.                                           "",
  1582.                                           "chrome,dialog=no,all,centerscreen",
  1583.                                           numMessages, messageList, statusFeedback, gPrintSettings, doPrintPreview, msgType, window);
  1584.     return true;
  1585.  
  1586. }
  1587.  
  1588. function PrintEnginePrint()
  1589. {
  1590.     var messageList = GetSelectedMessages();
  1591.     return PrintEnginePrintInternal(messageList, messageList.length, false, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINT_MSG);
  1592. }
  1593.  
  1594. function PrintEnginePrintPreview()
  1595. {
  1596.     var messageList = GetSelectedMessages();
  1597.     return PrintEnginePrintInternal(messageList, 1, true, Components.interfaces.nsIMsgPrintEngine.MNAB_PRINTPREVIEW_MSG);
  1598. }
  1599.  
  1600. function IsMailFolderSelected()
  1601. {
  1602.     var selectedFolders = GetSelectedMsgFolders();
  1603.     var numFolders = selectedFolders.length;
  1604.     if(numFolders !=1)
  1605.         return false;
  1606.  
  1607.     var folder = selectedFolders[0];
  1608.     if (!folder)
  1609.         return false;
  1610.  
  1611.     var server = folder.server;
  1612.     var serverType = server.type;
  1613.  
  1614.     if((serverType == "nntp"))
  1615.         return false;
  1616.     else return true;
  1617. }
  1618.  
  1619. function IsGetNewMessagesEnabled()
  1620. {
  1621.   // users don't like it when the "Get Msgs" button is disabled
  1622.   // so let's never do that. 
  1623.   // we'll just handle it as best we can in GetFolderMessages()
  1624.   // when they click "Get Msgs" and
  1625.   // Local Folders or a news server is selected
  1626.   // see bugs #89404 and #111102
  1627.   return true;
  1628. }
  1629.  
  1630. function IsGetNextNMessagesEnabled()
  1631. {
  1632.     var selectedFolders = GetSelectedMsgFolders();
  1633.     var numFolders = selectedFolders.length;
  1634.     if(numFolders !=1)
  1635.         return false;
  1636.  
  1637.     var folder = selectedFolders[0];
  1638.     if (!folder)
  1639.         return false;
  1640.  
  1641.     var server = folder.server;
  1642.     var serverType = server.type;
  1643.  
  1644.     var menuItem = document.getElementById("menu_getnextnmsg");
  1645.     if ((serverType == "nntp") && !folder.isServer) {
  1646.         var newsServer = server.QueryInterface(Components.interfaces.nsINntpIncomingServer);
  1647.         var menuLabel = gMessengerBundle.getFormattedString("getNextNMessages",
  1648.                                                             [ newsServer.maxArticles ]);
  1649.         menuItem.setAttribute("label",menuLabel);
  1650.         menuItem.removeAttribute("hidden");
  1651.         return true;
  1652.     }
  1653.  
  1654.     menuItem.setAttribute("hidden","true");
  1655.     return false;
  1656. }
  1657.  
  1658. function IsEmptyTrashEnabled()
  1659. {
  1660.   var folderURI = GetSelectedFolderURI();
  1661.   var server = GetServer(folderURI);
  1662.   return (server && server.canEmptyTrashOnExit ? IsMailFolderSelected() : false);
  1663. }
  1664.  
  1665. function IsCompactFolderEnabled()
  1666. {
  1667.   var server = GetServer(GetSelectedFolderURI());
  1668.   return (server && 
  1669.       ((server.type != 'imap') || server.canCompactFoldersOnServer) &&
  1670.       isCommandEnabled("cmd_compactFolder"));   // checks e.g. if IMAP is offline
  1671. }
  1672.  
  1673. var gDeleteButton = null;
  1674. var gMarkButton = null;
  1675.  
  1676. function SetUpToolbarButtons(uri)
  1677. {
  1678.     //dump("SetUpToolbarButtons("+uri+")\n");
  1679.  
  1680.     // eventually, we might want to set up the toolbar differently for imap,
  1681.     // pop, and news.  for now, just tweak it based on if it is news or not.
  1682.     var forNews = isNewsURI(uri);
  1683.  
  1684.     if(!gMarkButton) gMarkButton = document.getElementById("button-mark");
  1685.     if(!gDeleteButton) gDeleteButton = document.getElementById("button-delete");
  1686.  
  1687.     var buttonToHide = null;
  1688.     var buttonToShow = null;
  1689.  
  1690.     if (forNews) {
  1691.         buttonToHide = gDeleteButton;
  1692.         buttonToShow = gMarkButton;
  1693.     }
  1694.     else {
  1695.         buttonToHide = gMarkButton;
  1696.         buttonToShow = gDeleteButton;
  1697.     }
  1698.  
  1699.     if (buttonToHide) {
  1700.         buttonToHide.setAttribute('hidden',true);
  1701.     }
  1702.     if (buttonToShow) {
  1703.         buttonToShow.removeAttribute('hidden');
  1704.     }
  1705. }
  1706.  
  1707. var gMessageBrowser;
  1708.  
  1709. function getMessageBrowser()
  1710. {
  1711.   if (!gMessageBrowser)
  1712.     gMessageBrowser = document.getElementById("messagepane");
  1713.  
  1714.   return gMessageBrowser;
  1715. }
  1716.  
  1717. function getMarkupDocumentViewer()
  1718. {
  1719.   return getMessageBrowser().markupDocumentViewer;
  1720. }
  1721.  
  1722. function MsgSynchronizeOffline()
  1723. {
  1724.     //dump("in MsgSynchronize() \n"); 
  1725.     window.openDialog("chrome://messenger/content/msgSynchronize.xul",
  1726.           "", "centerscreen,chrome,modal,titlebar,resizable=yes",{msgWindow:msgWindow});              
  1727. }
  1728.  
  1729.  
  1730. function MsgOpenAttachment() {}
  1731. function MsgUpdateMsgCount() {}
  1732. function MsgImport() {}
  1733. function MsgSynchronize() {}
  1734. function MsgGetSelectedMsg() {}
  1735. function MsgGetFlaggedMsg() {}
  1736. function MsgSelectThread() {}
  1737. function MsgShowFolders(){}
  1738. function MsgShowLocationbar() {}
  1739. function MsgViewAttachInline() {}
  1740. function MsgWrapLongLines() {}
  1741. function MsgIncreaseFont() {}
  1742. function MsgDecreaseFont() {}
  1743. function MsgShowImages() {}
  1744. function MsgRefresh() {}
  1745. function MsgViewPageInfo() {}
  1746. function MsgFirstUnreadMessage() {}
  1747. function MsgFirstFlaggedMessage() {}
  1748. function MsgGoBack() {}
  1749. function MsgGoForward() {}
  1750. function MsgAddSenderToAddressBook() {}
  1751. function MsgAddAllToAddressBook() {}
  1752.  
  1753. function SpaceHit(event)
  1754. {
  1755.   var contentWindow = window.top.content;
  1756.  
  1757.   if (event && event.shiftKey) {
  1758.     // if at the start of the message, go to the previous one
  1759.     if (contentWindow.scrollY > 0) {
  1760.       contentWindow.scrollByPages(-1);
  1761.     }
  1762.     else {
  1763.       goDoCommand("cmd_previousUnreadMsg");
  1764.     }
  1765.   }
  1766.   else {
  1767.     // if at the end of the message, go to the next one
  1768.     if (contentWindow.scrollY < contentWindow.scrollMaxY) {
  1769.       contentWindow.scrollByPages(1);
  1770.     }
  1771.     else {
  1772.       goDoCommand("cmd_nextUnreadMsg");
  1773.     }
  1774.   }
  1775. }
  1776.  
  1777. function IsAccountOfflineEnabled()
  1778. {
  1779.   var selectedFolders = GetSelectedMsgFolders();
  1780.  
  1781.   if (selectedFolders && (selectedFolders.length == 1))
  1782.       return selectedFolders[0].supportsOffline;
  1783.      
  1784.   return false;
  1785. }
  1786.  
  1787. // init nsIPromptService and strings
  1788. function InitPrompts()
  1789. {
  1790.   if(!gPromptService) {
  1791.     gPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
  1792.     gPromptService = gPromptService.QueryInterface(Components.interfaces.nsIPromptService);
  1793.   }
  1794.   if (!gOfflinePromptsBundle) 
  1795.     gOfflinePromptsBundle = document.getElementById("bundle_offlinePrompts");
  1796. }
  1797.  
  1798. function DoGetNewMailWhenOffline()
  1799. {
  1800.   var sendUnsent = false;
  1801.   var goOnline = PromptGetMessagesOffline() == 0;
  1802.   if (goOnline)
  1803.   {
  1804.     if (this.CheckForUnsentMessages != undefined && CheckForUnsentMessages())
  1805.     {
  1806.       sendUnsent = gPromptService.confirmEx(window, 
  1807.                           gOfflinePromptsBundle.getString('sendMessagesOfflineWindowTitle'), 
  1808.                           gOfflinePromptsBundle.getString('sendMessagesLabel'),
  1809.                           gPromptService.BUTTON_TITLE_IS_STRING * (gPromptService.BUTTON_POS_0 + 
  1810.                             gPromptService.BUTTON_POS_1),
  1811.                           gOfflinePromptsBundle.getString('sendMessagesSendButtonLabel'),
  1812.                           gOfflinePromptsBundle.getString('sendMessagesNoSendButtonLabel'),
  1813.                           null, null, {value:0}) == 0;
  1814.     }
  1815.     if (!gOfflineManager) 
  1816.       GetOfflineMgrService();
  1817.     gOfflineManager.goOnline(sendUnsent /* sendUnsentMessages */, 
  1818.                              false /* playbackOfflineImapOperations */, 
  1819.                              msgWindow);
  1820.  
  1821.   }
  1822.   return goOnline;
  1823. }
  1824.  
  1825. // prompt for getting messages when offline
  1826. function PromptGetMessagesOffline()
  1827. {
  1828.   var buttonPressed = false;
  1829.   InitPrompts();
  1830.   if (gPromptService) {
  1831.     var checkValue = {value:false};
  1832.     buttonPressed = gPromptService.confirmEx(window, 
  1833.                             gOfflinePromptsBundle.getString('getMessagesOfflineWindowTitle'), 
  1834.                             gOfflinePromptsBundle.getString('getMessagesOfflineLabel'),
  1835.                             (gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
  1836.                             (gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
  1837.                             gOfflinePromptsBundle.getString('getMessagesOfflineGoButtonLabel'),
  1838.                             null, null, null, checkValue);
  1839.   }
  1840.   return buttonPressed;
  1841. }
  1842.  
  1843. // prompt for sending messages when offline
  1844. function PromptSendMessagesOffline()
  1845. {
  1846.   var buttonPressed = false;
  1847.   InitPrompts();
  1848.   if (gPromptService) {
  1849.     var checkValue= {value:false};
  1850.     buttonPressed = gPromptService.confirmEx(window, 
  1851.                             gOfflinePromptsBundle.getString('sendMessagesOfflineWindowTitle'), 
  1852.                             gOfflinePromptsBundle.getString('sendMessagesOfflineLabel'),
  1853.                             (gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
  1854.                             (gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1),
  1855.                             gOfflinePromptsBundle.getString('sendMessagesOfflineGoButtonLabel'),
  1856.                             null, null, null, checkValue, buttonPressed);
  1857.   }
  1858.   return buttonPressed;
  1859. }
  1860.  
  1861. function GetDefaultAccountRootFolder()
  1862. {
  1863.   try {
  1864.     var account = accountManager.defaultAccount;
  1865.     var defaultServer = account.incomingServer;
  1866.     var defaultFolder = defaultServer.rootMsgFolder;
  1867.     return defaultFolder;
  1868.   }
  1869.   catch (ex) {
  1870.   }
  1871.   return null;
  1872. }
  1873.  
  1874. function GetFolderMessages()
  1875. {
  1876.   var selectedFolders = GetSelectedMsgFolders();
  1877.   var defaultAccountRootFolder = GetDefaultAccountRootFolder();
  1878.   
  1879.   // if no default account, get msg isn't going do anything anyways
  1880.   // so bail out
  1881.   if (!defaultAccountRootFolder)
  1882.     return;
  1883.  
  1884.   // if nothing selected, use the default
  1885.   var folder = selectedFolders.length ? selectedFolders[0] : defaultAccountRootFolder;
  1886.  
  1887.   var serverType = folder.server.type;
  1888.  
  1889.   if (folder.isServer && (serverType == "nntp")) {
  1890.     // if we're doing "get msgs" on a news server
  1891.     // update unread counts on this server
  1892.     folder.server.performExpand(msgWindow);
  1893.     return;
  1894.   }
  1895.   else if (serverType == "none") {
  1896.     // if "Local Folders" is selected
  1897.     // and the user does "Get Msgs"
  1898.     // and LocalFolders is not deferred to,
  1899.     // get new mail for the default account
  1900.     //
  1901.     // XXX TODO
  1902.     // should shift click get mail for all (authenticated) accounts?
  1903.     // see bug #125885
  1904.     if (!folder.server.isDeferredTo)
  1905.       folder = defaultAccountRootFolder;
  1906.   }
  1907.  
  1908.   var folders = new Array(1);
  1909.   folders[0] = folder;
  1910.  
  1911.   var compositeDataSource = GetCompositeDataSource("GetNewMessages");
  1912.   GetNewMessages(folders, folder.server, compositeDataSource);
  1913. }
  1914.  
  1915. function SendUnsentMessages()
  1916. {
  1917.   var msgSendlater = Components.classes["@mozilla.org/messengercompose/sendlater;1"]
  1918.                .getService(Components.interfaces.nsIMsgSendLater);
  1919.   var identitiesCount, allIdentities, currentIdentity, numMessages, msgFolder;
  1920.  
  1921.   if (accountManager) { 
  1922.     allIdentities = accountManager.allIdentities;
  1923.     identitiesCount = allIdentities.Count();
  1924.     for (var i = 0; i < identitiesCount; i++) {
  1925.       currentIdentity = allIdentities.QueryElementAt(i, Components.interfaces.nsIMsgIdentity);
  1926.       msgFolder = msgSendlater.getUnsentMessagesFolder(currentIdentity);
  1927.       if(msgFolder) {
  1928.         numMessages = msgFolder.getTotalMessages(false /* include subfolders */);
  1929.         if(numMessages > 0) {
  1930.           messenger.sendUnsentMessages(currentIdentity, msgWindow);
  1931.           // right now, all identities point to the same unsent messages
  1932.           // folder, so to avoid sending multiple copies of the
  1933.           // unsent messages, we only call messenger.SendUnsentMessages() once
  1934.           // see bug #89150 for details
  1935.           break;
  1936.         }
  1937.       }
  1938.     } 
  1939.   }
  1940. }
  1941.  
  1942. function CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo)
  1943. {
  1944.   var outNumFolders = new Object();
  1945.   var inboxFolder = currentServer.rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders); 
  1946.   // coalesce the servers that download into the same folder...
  1947.   var index = localFoldersToDownloadTo.GetIndexOf(inboxFolder);
  1948.   if (index == -1)
  1949.   {
  1950.     if(inboxFolder) 
  1951.     {
  1952.       inboxFolder.biffState =  Components.interfaces.nsIMsgFolder.nsMsgBiffState_NoMail;
  1953.       inboxFolder.clearNewMessages();
  1954.     }
  1955.     localFoldersToDownloadTo.AppendElement(inboxFolder);
  1956.     index = pop3DownloadServersArray.length
  1957.     pop3DownloadServersArray[index] = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  1958.   }
  1959.   pop3DownloadServersArray[index].AppendElement(currentServer);
  1960. }
  1961.  
  1962. function GetMessagesForAllAuthenticatedAccounts()
  1963. {
  1964.   // now log into any server
  1965.   try
  1966.   {
  1967.     var allServers = accountManager.allServers;
  1968.     var i;
  1969.     // array of isupportsarrays of servers for a particular folder
  1970.     var pop3DownloadServersArray = new Array();
  1971.     // parallel isupports array of folders to download to...
  1972.     var localFoldersToDownloadTo = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  1973.     var pop3Server;
  1974.  
  1975.     for (i = 0; i < allServers.Count(); ++i)
  1976.     {
  1977.       var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
  1978.       var protocolinfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + currentServer.type].getService(Components.interfaces.nsIMsgProtocolInfo);
  1979.       if (protocolinfo.canGetMessages && !currentServer.passwordPromptRequired)
  1980.       {
  1981.         if (currentServer.type == "pop3")
  1982.         {
  1983.           CoalesceGetMsgsForPop3ServersByDestFolder(currentServer, pop3DownloadServersArray, localFoldersToDownloadTo);
  1984.           pop3Server = currentServer.QueryInterface(Components.interfaces.nsIPop3IncomingServer);
  1985.         }
  1986.         else
  1987.         // get new messages on the server for imap or rss
  1988.           GetMessagesForInboxOnServer(currentServer);
  1989.       }
  1990.     }
  1991.     for (i = 0; i < pop3DownloadServersArray.length; ++i)
  1992.     {
  1993.       // any ol' pop3Server will do - the serversArray specifies which servers to download from
  1994.       pop3Server.downloadMailFromServers(pop3DownloadServersArray[i], msgWindow, localFoldersToDownloadTo.GetElementAt(i), null);
  1995.     }
  1996.   }
  1997.   catch(ex)
  1998.   {
  1999.       dump(ex + "\n");
  2000.   }
  2001. }
  2002.  
  2003. function GetMessagesForAccount(aEvent)
  2004. {
  2005.   var uri = aEvent.target.id;
  2006.   var server = GetServer(uri);
  2007.   GetMessagesForInboxOnServer(server);
  2008.   aEvent.preventBubble();
  2009. }
  2010.  
  2011.  
  2012. function CommandUpdate_UndoRedo()
  2013. {
  2014.     ShowMenuItem("menu_undo", true);
  2015.     EnableMenuItem("menu_undo", SetupUndoRedoCommand("cmd_undo"));
  2016.     ShowMenuItem("menu_redo", true);
  2017.     EnableMenuItem("menu_redo", SetupUndoRedoCommand("cmd_redo"));
  2018. }
  2019.  
  2020. function SetupUndoRedoCommand(command)
  2021. {
  2022.     var loadedFolder = GetLoadedMsgFolder();
  2023.  
  2024.     // if we have selected a server, and are viewing account central
  2025.     // there is no loaded folder
  2026.     if (!loadedFolder)
  2027.       return false;
  2028.  
  2029.     var server = loadedFolder.server;
  2030.     if (!(server.canUndoDeleteOnServer))
  2031.       return false;
  2032.  
  2033.     var canUndoOrRedo = false;
  2034.     var txnType = 0;
  2035.  
  2036.     if (command == "cmd_undo")
  2037.     {
  2038.         canUndoOrRedo = messenger.CanUndo();
  2039.         txnType = messenger.GetUndoTransactionType();
  2040.     }
  2041.     else
  2042.     {
  2043.         canUndoOrRedo = messenger.CanRedo();
  2044.         txnType = messenger.GetRedoTransactionType();
  2045.     }
  2046.  
  2047.     if (canUndoOrRedo)
  2048.     {
  2049.         switch (txnType)
  2050.         {
  2051.         default:
  2052.         case 0:
  2053.             goSetMenuValue(command, 'valueDefault');
  2054.             break;
  2055.         case 1:
  2056.             goSetMenuValue(command, 'valueDeleteMsg');
  2057.             break;
  2058.         case 2:
  2059.             goSetMenuValue(command, 'valueMoveMsg');
  2060.             break;
  2061.         case 3:
  2062.             goSetMenuValue(command, 'valueCopyMsg');
  2063.             break;
  2064.         }
  2065.     }
  2066.     else
  2067.     {
  2068.         goSetMenuValue(command, 'valueDefault');
  2069.     }
  2070.     return canUndoOrRedo;
  2071. }
  2072.  
  2073. function HandleJunkStatusChanged(folder)
  2074. {
  2075.   // this might be the stand alone window, open to a message that was
  2076.   // and attachment (or on disk), in which case, we want to ignore it.
  2077.   var loadedMessage = GetLoadedMessage();
  2078.   if (loadedMessage && (!(/type=application\/x-message-display/.test(loadedMessage))) && IsCurrentLoadedFolder(folder))
  2079.   {
  2080.     // if multiple message are selected and we change the junk status
  2081.     // we don't want to show the junk bar (since the message pane is blank)
  2082.     var msgHdr = null;
  2083.     if (GetNumSelectedMessages() == 1)
  2084.       msgHdr = messenger.msgHdrFromURI(loadedMessage);
  2085.     gMessageNotificationBar.setJunkMsg(msgHdr);
  2086.   }
  2087. }
  2088.  
  2089. var gMessageNotificationBar = 
  2090. {
  2091.   mBarStatus: 0,
  2092.   // flag bit values for mBarStatus, indexed by kMsgNotificationXXX
  2093.   mBarFlagValues: [
  2094.                     0, // for no msgNotificationBar
  2095.                     1, // 1 << (kMsgNotificationPhishingBar - 1)
  2096.                     2, // 1 << (kMsgNotificationJunkBar - 1)
  2097.                     4  // 1 << (kMsgNotificationRemoteImages - 1)
  2098.                   ],
  2099.  
  2100.   mMsgNotificationBar: document.getElementById('msgNotificationBar'),
  2101.  
  2102.   setJunkMsg: function(aMsgHdr)
  2103.   {
  2104.     var isJunk = false;
  2105.   
  2106.     if (aMsgHdr) 
  2107.     {
  2108.       var junkScore = aMsgHdr.getStringProperty("junkscore"); 
  2109.       isJunk = ((junkScore != "") && (junkScore != "0"));
  2110.     }
  2111.  
  2112.     this.updateMsgNotificationBar(kMsgNotificationJunkBar, isJunk);
  2113.  
  2114.     goUpdateCommand('button_junk');
  2115.   },
  2116.  
  2117.   setRemoteContentMsg: function(aMsgHdr)
  2118.   {  
  2119.     var blockRemote = aMsgHdr &&
  2120.                       aMsgHdr.getUint32Property("remoteContentPolicy") == kBlockRemoteContent;
  2121.     this.updateMsgNotificationBar(kMsgNotificationRemoteImages, blockRemote);
  2122.   },
  2123.  
  2124.   // aUrl is the nsIURI for the message currently loaded in the message pane
  2125.   setPhishingMsg: function(aUrl)
  2126.   {
  2127.     // if we've explicitly marked this message as not being an email scam, then don't
  2128.     // bother checking it with the phishing detector.
  2129.     var phishingMsg = false;
  2130.     if (!checkMsgHdrPropertyIsNot("notAPhishMessage", kIsAPhishMessage))
  2131.       phishingMsg = isMsgEmailScam(aUrl);
  2132.     this.updateMsgNotificationBar(kMsgNotificationPhishingBar, phishingMsg);
  2133.   },
  2134.  
  2135.   clearMsgNotifications: function()
  2136.   {
  2137.     this.mBarStatus = 0;
  2138.     this.mMsgNotificationBar.selectedIndex = 0;
  2139.     this.mMsgNotificationBar.collapsed = true;
  2140.   },
  2141.  
  2142.   // private method used to set our message notification deck to the correct value...
  2143.   updateMsgNotificationBar: function(aIndex, aSet)
  2144.   {
  2145.     var chunk = this.mBarFlagValues[aIndex];
  2146.     var status = aSet ? this.mBarStatus | chunk : this.mBarStatus & ~chunk;
  2147.     this.mBarStatus = status;
  2148.  
  2149.     // the phishing message takes precedence over the junk message
  2150.     // which takes precedence over the remote content message
  2151.     this.mMsgNotificationBar.selectedIndex = this.mBarFlagValues.indexOf(status & -status);
  2152.  
  2153.     this.mMsgNotificationBar.collapsed = !status;
  2154.   }
  2155. };
  2156.  
  2157. function LoadMsgWithRemoteContent()
  2158. {
  2159.   // we want to get the msg hdr for the currently selected message
  2160.   // change the "remoteContentBar" property on it
  2161.   // then reload the message
  2162.  
  2163.   setMsgHdrPropertyAndReload("remoteContentPolicy", kAllowRemoteContent);
  2164. }
  2165.  
  2166. function MsgIsNotAScam()
  2167. {
  2168.   // we want to get the msg hdr for the currently selected message
  2169.   // change the "isPhishingMsg" property on it
  2170.   // then reload the message
  2171.  
  2172.   setMsgHdrPropertyAndReload("notAPhishMessage", kNotAPhishMessage);
  2173. }
  2174.  
  2175. function setMsgHdrPropertyAndReload(aProperty, aValue)
  2176. {
  2177.   // we want to get the msg hdr for the currently selected message
  2178.   // change the appropiate property on it then reload the message
  2179.  
  2180.   var msgURI = GetLoadedMessage();
  2181.  
  2182.   if (msgURI && !(/type=application\/x-message-display/.test(msgURI)))
  2183.   {
  2184.     var msgHdr = messenger.msgHdrFromURI(msgURI);
  2185.     if (msgHdr)
  2186.     {
  2187.       msgHdr.setUint32Property(aProperty, aValue);
  2188.       MsgReload();
  2189.     }
  2190.   }
  2191. }
  2192.  
  2193. function checkMsgHdrPropertyIsNot(aProperty, aValue)
  2194. {
  2195.   // we want to get the msg hdr for the currently selected message,
  2196.   // get the appropiate property on it and then test against value.
  2197.  
  2198.   var msgURI = GetLoadedMessage();
  2199.     
  2200.   if (msgURI && !(/type=application\/x-message-display/.test(msgURI)))
  2201.   {
  2202.     var msgHdr = messenger.msgHdrFromURI(msgURI);
  2203.     return (msgHdr && msgHdr.getUint32Property(aProperty) != aValue);
  2204.   }
  2205.   return false;
  2206. }
  2207.  
  2208. function MarkCurrentMessageAsRead()
  2209. {
  2210.   gDBView.doCommand(nsMsgViewCommandType.markMessagesRead);
  2211. }
  2212.  
  2213. function ClearPendingReadTimer()
  2214. {
  2215.   if (gMarkViewedMessageAsReadTimer)
  2216.   {
  2217.     clearTimeout(gMarkViewedMessageAsReadTimer);
  2218.     gMarkViewedMessageAsReadTimer = null;
  2219.   }
  2220. }
  2221.  
  2222. function OnMsgParsed(aUrl)
  2223. {
  2224.   gMessageNotificationBar.setPhishingMsg(aUrl);
  2225. }
  2226.  
  2227. function OnMsgLoaded(aUrl)
  2228. {
  2229.     if (!aUrl)
  2230.       return;
  2231.  
  2232.     var folder = aUrl.folder;
  2233.     var msgURI = GetLoadedMessage();
  2234.     var msgHdr = null;
  2235.  
  2236.     if (!folder || !msgURI)
  2237.       return;
  2238.  
  2239.     // If we are in the middle of a delete or move operation, make sure that
  2240.     // if the user clicks on another message then that message stays selected
  2241.     // and the selection does not "snap back" to the message chosen by
  2242.     // SetNextMessageAfterDelete() when the operation completes (bug 243532).
  2243.     gNextMessageViewIndexAfterDelete = -2;
  2244.  
  2245.     if (!(/type=application\/x-message-display/.test(msgURI)))
  2246.       msgHdr = messenger.msgHdrFromURI(msgURI);
  2247.  
  2248.     gMessageNotificationBar.setJunkMsg(msgHdr);
  2249.  
  2250.     // we just finished loading a message. set a timer to actually mark the message as read after n seconds
  2251.     // where n can be configured by the user.
  2252.     var markReadOnADelay = gPrefBranch.getBoolPref("mailnews.mark_message_read.delay");
  2253.     if (msgHdr && !msgHdr.isRead)
  2254.     {
  2255.       var wintype = document.documentElement.getAttribute('windowtype');
  2256.       if (markReadOnADelay && wintype == "mail:3pane") // only use the timer if viewing using the 3-pane preview pane and the user has set the pref
  2257.         gMarkViewedMessageAsReadTimer = setTimeout(MarkCurrentMessageAsRead, gPrefBranch.getIntPref("mailnews.mark_message_read.delay.interval") * 1000);
  2258.       else
  2259.         MarkCurrentMessageAsRead();
  2260.      }
  2261.         
  2262.     // See if MDN was requested but has not been sent.
  2263.     HandleMDNResponse(aUrl);
  2264.     
  2265.     var currentMsgFolder = folder.QueryInterface(Components.interfaces.nsIMsgFolder);
  2266.     if (!IsImapMessage(msgURI))
  2267.       return;
  2268.  
  2269.     var imapServer = currentMsgFolder.server.QueryInterface(Components.interfaces.nsIImapIncomingServer);
  2270.     var storeReadMailInPFC = imapServer.storeReadMailInPFC;
  2271.     if (storeReadMailInPFC)
  2272.     {
  2273.       var messageID;
  2274.  
  2275.       var copyToOfflineFolder = true;
  2276.  
  2277.       // look in read mail PFC for msg with same msg id - if we find one,
  2278.       // don't put this message in the read mail pfc.
  2279.       var outputPFC = imapServer.GetReadMailPFC(true);
  2280.  
  2281.       if (msgHdr)
  2282.       {
  2283.         messageID = msgHdr.messageId;
  2284.         if (messageID.length > 0)
  2285.         {
  2286.           var readMailDB = outputPFC.getMsgDatabase(msgWindow);
  2287.           if (readMailDB)
  2288.           {
  2289.             var hdrInDestDB = readMailDB.getMsgHdrForMessageID(messageID);
  2290.             if (hdrInDestDB)
  2291.               copyToOfflineFolder = false;
  2292.           }
  2293.         }
  2294.       }
  2295.       if (copyToOfflineFolder)
  2296.       {
  2297.         var messages = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
  2298.         messages.AppendElement(msgHdr);
  2299.  
  2300.         res = outputPFC.copyMessages(currentMsgFolder, messages, false /*isMove*/, msgWindow /* nsIMsgWindow */, null /* listener */, false /* isFolder */, false /*allowUndo*/ );
  2301.       }
  2302.      }
  2303. }
  2304.  
  2305. //
  2306. // This function handles all mdn response generation (ie, imap and pop).
  2307. // For pop the msg uid can be 0 (ie, 1st msg in a local folder) so no
  2308. // need to check uid here. No one seems to set mimeHeaders to null so
  2309. // no need to check it either.
  2310. //
  2311. function HandleMDNResponse(aUrl)
  2312. {
  2313.   if (!aUrl)
  2314.     return;
  2315.  
  2316.   var msgFolder = aUrl.folder;
  2317.   var msgURI = GetLoadedMessage();
  2318.   if (!msgFolder || !msgURI)
  2319.     return;
  2320.  
  2321.     if (IsNewsMessage(msgURI))
  2322.         return;
  2323.  
  2324.   // if the message is marked as junk, do NOT attempt to process a return receipt
  2325.   // in order to better protect the user
  2326.   if (SelectedMessagesAreJunk())
  2327.     return;
  2328.  
  2329.   var msgHdr = messenger.msgHdrFromURI(msgURI);
  2330.   var mimeHdr;
  2331.  
  2332.   try {
  2333.     mimeHdr = aUrl.mimeHeaders;
  2334.   } catch (ex) {
  2335.     return;
  2336.   }
  2337.  
  2338.   // If we didn't get the message id when we downloaded the message header,
  2339.   // we cons up an md5: message id. If we've done that, we'll try to extract
  2340.   // the message id out of the mime headers for the whole message.
  2341.   var msgId = msgHdr.messageId;
  2342.   if (msgId.split(":")[0] == "md5")
  2343.   {
  2344.     var mimeMsgId = mimeHdr.extractHeader("Message-Id", false);
  2345.     if (mimeMsgId)
  2346.       msgHdr.messageId = mimeMsgId;
  2347.   }
  2348.   
  2349.   // After a msg is downloaded it's already marked READ at this point so we must check if
  2350.   // the msg has a "Disposition-Notification-To" header and no MDN report has been sent yet.
  2351.   var msgFlags = msgHdr.flags;
  2352.   if ((msgFlags & MSG_FLAG_IMAP_DELETED) || (msgFlags & MSG_FLAG_MDN_REPORT_SENT))
  2353.     return;
  2354.  
  2355.   var DNTHeader = mimeHdr.extractHeader("Disposition-Notification-To", false);
  2356.   var oldDNTHeader = mimeHdr.extractHeader("Return-Receipt-To", false);
  2357.   if (!DNTHeader && !oldDNTHeader)
  2358.     return;
  2359.  
  2360.   // Everything looks good so far, let's generate the MDN response.
  2361.   var mdnGenerator = Components.classes["@mozilla.org/messenger-mdn/generator;1"].
  2362.                                   createInstance(Components.interfaces.nsIMsgMdnGenerator);
  2363.   mdnGenerator.process(MDN_DISPOSE_TYPE_DISPLAYED, msgWindow, msgFolder, msgHdr.messageKey, mimeHdr, false);
  2364.  
  2365.   // Reset mark msg MDN "Sent" and "Not Needed".
  2366.   msgHdr.flags = (msgFlags & ~MSG_FLAG_MDN_REPORT_NEEDED);
  2367.   msgHdr.OrFlags(MSG_FLAG_MDN_REPORT_SENT);
  2368.  
  2369.   // Commit db changes.
  2370.   var msgdb = msgFolder.getMsgDatabase(msgWindow);
  2371.   if (msgdb)
  2372.     msgdb.Commit(MSG_DB_LARGE_COMMIT);
  2373. }
  2374.  
  2375. function MsgSearchMessages()
  2376. {
  2377.   var preselectedFolder = null;
  2378.   if ("GetFirstSelectedMsgFolder" in window)
  2379.     preselectedFolder = GetFirstSelectedMsgFolder();
  2380.  
  2381.   var args = { folder: preselectedFolder };
  2382.   OpenOrFocusWindow(args, "mailnews:search", "chrome://messenger/content/SearchDialog.xul");
  2383. }
  2384.  
  2385. function MsgJunkMail()
  2386. {
  2387.   MsgJunkMailInfo(true);
  2388.   var preselectedFolder = null;
  2389.   if ("GetFirstSelectedMsgFolder" in window)
  2390.     preselectedFolder = GetFirstSelectedMsgFolder();
  2391.  
  2392.   var args = { folder: preselectedFolder };
  2393.   window.openDialog("chrome://messenger/content/junkMail.xul", "",
  2394.                     "chrome,resizable=no,modal,dialog", args);
  2395. }
  2396.  
  2397. function MsgJunkMailInfo(aCheckFirstUse)
  2398. {
  2399.   if (aCheckFirstUse) {
  2400.     if (!pref.getBoolPref("mailnews.ui.junk.firstuse"))
  2401.       return;
  2402.     pref.setBoolPref("mailnews.ui.junk.firstuse", false);
  2403.  
  2404.     // check to see if this is an existing profile where the user has started using
  2405.     // the junk mail feature already
  2406.     var junkmailPlugin = Components.classes["@mozilla.org/messenger/filter-plugin;1?name=bayesianfilter"]
  2407.                                    .getService(Components.interfaces.nsIJunkMailPlugin);
  2408.     if (junkmailPlugin.userHasClassified)
  2409.       return;
  2410.   }
  2411.  
  2412.   var desiredWindow = GetWindowByWindowType("mailnews:junkmailinfo");
  2413.  
  2414.   if (desiredWindow)
  2415.     desiredWindow.focus();
  2416.   else
  2417.     window.openDialog("chrome://messenger/content/junkMailInfo.xul", "mailnews:junkmailinfo", "centerscreen,resizeable=no,titlebar,chrome,modal", null);
  2418. }
  2419.  
  2420. function MsgSearchAddresses()
  2421. {
  2422.   var args = { directory: null };
  2423.   OpenOrFocusWindow(args, "mailnews:absearch", "chrome://messenger/content/ABSearchDialog.xul");
  2424. }
  2425.  
  2426. function MsgFilterList(args)
  2427. {
  2428.   OpenOrFocusWindow(args, "mailnews:filterlist", "chrome://messenger/content/FilterListDialog.xul");
  2429. }
  2430.  
  2431. function GetWindowByWindowType(windowType)
  2432. {
  2433.   var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
  2434.   return windowManager.getMostRecentWindow(windowType);
  2435. }
  2436.  
  2437. function OpenOrFocusWindow(args, windowType, chromeURL)
  2438. {
  2439.   var desiredWindow = GetWindowByWindowType(windowType);
  2440.  
  2441.   if (desiredWindow) {
  2442.     desiredWindow.focus();
  2443.     if ("refresh" in args && args.refresh)
  2444.       desiredWindow.refresh();
  2445.   }
  2446.   else
  2447.     window.openDialog(chromeURL, "", "chrome,resizable,status,centerscreen,dialog=no", args);
  2448. }
  2449.